9

Tengo una tabla que tiene un índice único en una tabla con una columna ordinal. Así, por ejemplo, la tabla tendrá las siguientes columnas:DbContext SaveChanges Order of Statement Execution

IDtabla, ID1, ID2, ordinal

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

El problema que tengo es que cuando elimino un registro de la base de datos, vuelvo a secuenciar los ordinales para que vuelvan a ser secuenciales. Mi función de borrado se verá así:

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

La cuestión es que cuando llamo Context.SaveChanges() se rompe el índice único como parece a ejecutar las sentencias en un orden diferente al que se aprobaron. Por ejemplo ocurre lo siguiente:

  1. secuenciar los ordinales
  2. Eliminar el registro

En lugar de:

  1. Eliminar el registro
  2. secuenciar los ordinales

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

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

Respuesta

9

Orden de comandos está completamente bajo el control de EF. La única manera de cómo puede afectar al orden está utilizando SaveChanges independientes 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 de 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 tiene que extraer todos los registros afectados de la base de datos a su aplicación, cambiar su ordinal y guardarlos de nuevo en la base de datos uno por uno.

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

+0

¡Hola gracias por la respuesta! Lo he implementado previamente con una base de datos y, como lo ha dicho, apesta. El código es horrible y fue un problema, además de que solo será accesible desde una sección de administración y cambiará pequeñas cantidades. La razón principal por la que los ordinales se vuelven a secuenciar es que los usuarios de la administración pueden establecer el orden en varias tablas y ser quisquillosos o confundidos cuando ven espacios ... Un poco fastidioso que EF no ejecuta en el orden que usted proporciona. – didiHamman