Pregunta

Tengo una tabla que tiene un índice único en una tabla con una columna ordinal. Entonces, por ejemplo, la tabla tendrá las siguientes columnas:

TableID, ID1, ID2, Ordinal

El índice único es a través de las columnas ID1, ID2, Ordinal.

El problema que tengo es que al eliminar un registro de la base de datos, resecigo los ordenales para que vuelvan a ser secuenciales. Mi función de eliminación se verá así:

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

El problema es que cuando llamo context.saveChanges () rompe el índice único, ya que parece ejecutar las declaraciones en un orden diferente al que se aprobaron. Por ejemplo, lo siguiente sucede:

  1. Resequencia de las ordinales
  2. Eliminar el registro

En vez de:

  1. Eliminar el registro
  2. Resequencia de las ordinales

¿Es este el comportamiento correcto de EF? Y si es así, ¿hay alguna forma de anular este comportamiento para forzar el orden de ejecución?

Si no he explicado esto correctamente, hágamelo saber ...

¿Fue útil?

Solución

El orden de los comandos está completamente bajo el control de EF. La única forma en que puede afectar el pedido es usar SaveChanges separados para cada operación:

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

También debe ejecutar ese código en transacción creada manualmente para garantizar la atomicidad (=> TransactionScope).

Pero la mejor solución probablemente sería utilizar el procedimiento almacenado porque su resecuenciación debe extraer todos los registros afectados de la base de datos a su aplicación, cambiar su ordinal y guardarlos de nuevo a la base de datos una por una.

Por cierto. Hacer esto con los olores de la base de datos. ¿Cuál es el problema de tener una brecha en su secuencia "ordinal"?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top