2009-04-28 8 views
5

Tengo una tabla que tiene el siguiente aspecto:Linq2SQL tratar con inserciones/eliminaciones en la mesa con restricciones únicas

TABLE Foo 
{ 
    Guid Id [PK], 
    int A [FK], 
    int B [FK], 
    int C [FK], 
} 

Y restricción única sobre A, B y C.

Ahora digamos por ejemplo, inserta una fila con un PK nuevo con A = 1, B = 1, C = 1.

SubmitChanges(), todos contentos.

Ahora edita la tabla.

se quita la entrada anterior, e insertar una fila con una PK fresk con A = 1, B = 1, C = 1.

SubmitChanges() BOOM! Exclusión de restricción de clave única de SQL.

Por lo que puedo ver, intenta insertar primero el nuevo registro, y luego tratar de eliminar el anterior. Incluso puedo entender que no es posible determinar el orden en que esto debe suceder.

Pero, ¿qué puedo hacer al respecto? ¿Sería una mejor solución hacer que esos 3 campos compuestos PK (y eliminar el anterior) o incluso funcionar?

Por ahora, la 'solución' es eliminar las restricciones únicas del DB (pero prefiero no hacerlo).

Respuesta

3

Una opción sería la creación de una transacción (ya sea una operación de conexión de ruedas, o una TransactionScope) - quitar el registro y SubmitChanges, añadir el registro y SubmitChanges, y finalmente confirmar la transacción (o continuación del artículo si usted sopló arriba).

Tenga en cuenta que puede asociar una transacción vinculada a la conexión a través del constructor de contexto de datos IIRC. TransactionScope también debería funcionar, y es más fácil de hacer, pero no tan eficiente.

O bien, escriba un SP que realice este trabajo de intercambio en la base de datos y acceda a ese SP a través del contexto-datos.

+0

Lamentablemente no es tan fácil. La lista se mantiene a través de BindingList, obtenida de un EntitySet vinculado a un DataGridView. – leppie

1

Tuve el mismo problema. Terminé escribiendo una clase contenedora con una colección 'Agregada' y 'Eliminada' de entidades que mantuve. Además de una colección 'Actual'. La interfaz de usuario estaba vinculada a la colección actual.

Solo cuando voy a guardar hago InsertOnSubmit/DeleteOnSubmit, y analizo las 2 colecciones para decidir a qué entidades hacer qué.

+0

Gracias por la respuesta (+1) Por cierto, he encontrado que lo más fácil es simplemente enviar modificaciones en tiempo real a la base de datos, entonces esto no puede suceder :) Otra opción podría ser agregar una transacción a la anterior si necesita 'deshacer' '. – leppie

Cuestiones relacionadas