2009-04-28 6 views
5

ich eine Tabelle, die wie folgt aussieht:Linq2SQL mit Einsätzen Umgang/löscht auf Tabelle mit einzigartigen Einschränkungen

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

Und eindeutige Einschränkung über A, B und C.

Jetzt zum Beispiel sagen, Sie fügen eine Zeile mit einem frischen PK mit ein mit A = 1, B = 1, C = 1.

SubmitChanges(), alle glücklich.

Jetzt bearbeiten Sie die Tabelle.

Sie den vorherigen Eintrag entfernen, und eine Zeile mit einem fresk PK Einsatz mit A = 1, B = 1, C = 1.

SubmitChanges() BOOM! Eindeutige Schlüsseleinschränkung SQL-Ausnahme.

Von dem, was ich sehen kann, versucht es, zuerst den neuen Datensatz einzufügen und dann zu versuchen, den vorherigen zu löschen. Ich kann sogar verstehen, dass es nicht möglich ist, die Reihenfolge zu bestimmen, in der dies geschehen muss.

Aber was kann ich dagegen tun? Würden diese 3 Felder zu einer zusammengesetzten PK machen (und die alte entfernen) wäre eine bessere Lösung oder wird es nicht einmal funktionieren?

Für jetzt ist die "Lösung", die eindeutigen Einschränkungen aus der Datenbank zu entfernen (aber ich werde es eher nicht tun).

Antwort

3

Eine Möglichkeit wäre, eine Transaktion erstellen (entweder eine Verbindung gebundene Transaktion oder ein TransactionScope) - entfernen Sie die Aufzeichnung und SubmitChanges, fügen Sie den Datensatz und SubmitChanges, dann begeht schließlich die Transaktion (oder Roll-Back, wenn Sie bläst oben).

Beachten Sie, dass Sie eine verbindungsgebundene Transaktion über den Datenkontextkonstruktor IIRC zuordnen können. TransactionScope sollte auch funktionieren, und ist einfacher zu tun - aber nicht ganz so effizient.

Schreiben Sie alternativ einen SP, der diesen Swap-Job in der Datenbank ausführt, und greifen Sie über den Datenkontext auf diesen SP über zu.

+0

Leider nicht so einfach. Die Liste wird über eine BindingList verwaltet, die von einem an ein DataGridView gebundenen EntitySet erhalten wird. – leppie

1

Ich hatte das gleiche Problem. Ich habe eine Wrapper-Klasse mit einer 'Added' und 'Deleted' Sammlung von Entitäten, die ich gepflegt habe, geschrieben. Sowie eine "aktuelle" Sammlung. Die Benutzeroberfläche war an die aktuelle Sammlung gebunden.

Nur wenn ich gehe, um zu speichern, ich InsertOnSubmit/DeleteOnSubmit, und ich parse die 2 Sammlungen, um zu entscheiden, welche Entitäten, was zu tun.

+0

Danke für die Antwort (+1) Btw Ich habe festgestellt, das einfachste ist eigentlich nur Änderungen in Echtzeit an die DB zu senden, dann kann dies nicht passieren :) Eine andere Option könnte eine Transaktion zu den oben genannten hinzufügen, wenn Sie 'rückgängig machen müssen ". – leppie

Verwandte Themen