Vorgehensweise: Übergeben von Änderungen an die Datenbank
Unabhängig von der Anzahl der Änderungen an Ihren Objekten erfolgen diese Änderungen nur an den Replikaten im Arbeitsspeicher. Sie haben die eigentlichen Daten in der Datenbank nicht verändert. Ihre Änderungen werden erst dann zum Server gesendet, wenn Sie explizit SubmitChanges im DataContext aufrufen.
Bei diesem Aufruf versucht der DataContext, die Änderungen in entsprechende SQL-Befehle zu übersetzen. Sie können Ihre eigene, benutzerdefinierte Logik verwenden, um diese Aktionen zu überschreiben. Die Reihenfolge der Übergabe wird jedoch durch einen Dienst des DataContext koordiniert, der als Änderungsprozessor bezeichnet wird. Die Ereignisse finden in der folgenden Reihenfolge statt:
Wenn Sie SubmitChanges aufrufen, prüft LINQ to SQL den Satz unbekannter Objekte, um zu ermitteln, ob diesen neue Instanzen hinzugefügt wurden. Ist dies der Fall, werden diese Instanzen dem Satz verfolgter Objekte hinzugefügt.
Alle Objekte mit ausstehenden Änderungen werden in eine Objektsequenz gegliedert, die auf den Abhängigkeiten zwischen den Objekten basiert. Objekte, deren Änderungen von anderen Objekten abhängen, werden nach ihren Abhängigkeiten eingeordnet.
Direkt vor der Übergabe der eigentlichen Änderungen startet LINQ to SQL eine Transaktion, um die Reihe einzelner Befehle zu kapseln.
Die Änderungen an den Objekten werden nacheinander in SQL-Befehle übersetzt und an den Server gesendet.
Zu diesem Zeitpunkt führen Fehler, die von der Datenbank erkannt werden, zum Stoppen der Übergabe, und eine Ausnahme wird ausgelöst. Alle Änderungen an der Datenbank werden rückgängig gemacht, als ob keine Übergabe stattgefunden hätte. Der DataContext verfügt weiterhin über eine vollständige Aufzeichnung aller Änderungen. Daher können Sie versuchen, das Problem zu beheben und SubmitChanges wie im folgenden Codebeispiel erneut aufrufen.
Beispiel
Wird die Transaktion rund um die Übergabe erfolgreich abgeschlossen, akzeptiert der DataContext die Änderungen an den Objekten, indem er die Informationen zur Änderungsverfolgung ignoriert.
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Make changes here.
try
{
db.SubmitChanges();
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
// Make some adjustments.
// ...
// Try again.
db.SubmitChanges();
}
Dim db As New Northwnd("c:\northwnd.mdf")
' Make changes here.
Sub MakeChanges()
Try
db.SubmitChanges()
Catch e As ChangeConflictException
Console.WriteLine(e.Message)
' Make some adjustments
'...
' Try again.
db.SubmitChanges()
End Try
End Sub