Wie benutze ich eine Transaktion in LINQ to SQL mit stored procedures?
Ich habe ein Stück code, das sieht ungefähr so aus (ClearImportTable und InsertPage sind gespeicherte Prozeduren):
datacontext.ClearImportTable() //Essentially a DELETE FROM table
for (int i = 1; i < MAX_PAGES; ++i){
datacontext.InsertPage(i); //Inserts data into the table
}
Dies ist eine etwas vereinfachte version von meinem code, aber die Idee ist, dass es löscht die Tabelle vor dem einfügen von Datensätzen. Das problem ist nur, dass wenn ein Fehler Auftritt, nachdem ClearImportTable, alle Daten aus der Tabelle gelöscht wird. Gibt es eine Möglichkeit, wickeln Sie diese in einer Transaktion, so dass, wenn es irgendwelche Fehler, alles wird wieder so, wie es war?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine Transaktion durchführen Umfang:
Wenn eine Ausnahme Auftritt, oder der using-block wird verlassen, ohne auf die Transaktion.Complete (vollständig), dann alles durchgeführt, die innerhalb des using-Blocks wird ein Rollback ausgeführt.
Müssen Sie die Referenz des Systems.Transaktionen Montage.
Als "Segeln Judo" bereits erwähnt, habe ich die TransactionScope-Blöcke mit großem Erfolg, wenn ich zum aufrufen von gespeicherter Prozeduren. Aber es gibt einen "gotcha", die ich ausgeführt habe, in dem eine exception wird geworfen, die sagen, dass die "Transaktion ist im Zweifel." Um dies zu umgehen hatte ich zu nennen ein nondeferred Methode auf den proc zu machen, bewerten Sie das Ergebnis sofort. Also anstatt
Hatte ich es nennen mag...
In diesem Beispiel, ToList() könnte nondeferred Methode, die bewirkt, dass LINQ to sofort bewerten das Ergebnis.
Ich gehe davon aus dies ist weil LINQs faul (latente) die Natur ist nicht gut zu spielen mit dem Zeitpunkt der Transaktion, aber das ist nur eine Vermutung. Wenn jemand könnte glänzen mehr Licht auf diesen, würde ich gerne davon zu hören.
Legen Sie die Transaction-Eigenschaft auf den DataContext?