Instrukcje: Przesyłanie zmian do bazy danych
Niezależnie od liczby zmian wprowadzonych w obiektach zmiany są wprowadzane tylko do replik w pamięci. Nie wprowadzono żadnych zmian w rzeczywistych danych w bazie danych. Zmiany nie są przesyłane na serwer do momentu jawnego wywołania SubmitChanges DataContextelementu .
Podczas wykonywania tego wywołania DataContext program próbuje przetłumaczyć zmiany na równoważne polecenia SQL. Możesz użyć własnej logiki niestandardowej, aby zastąpić te akcje, ale kolejność przesyłania jest organizowana przez usługę DataContext znaną jako procesor zmian. Sekwencję zdarzeń przedstawiono w następujący sposób:
Podczas wywoływania metody SubmitChangeslinQ to SQL sprawdza zestaw znanych obiektów w celu określenia, czy do nich dołączono nowe wystąpienia. Jeśli istnieją, te nowe wystąpienia są dodawane do zestawu śledzonych obiektów.
Wszystkie obiekty, które mają oczekujące zmiany, są uporządkowane w sekwencji obiektów na podstawie zależności między nimi. Obiekty, których zmiany zależą od innych obiektów, są sekwencjonowane po ich zależnościach.
Bezpośrednio przed przesłaniem jakichkolwiek rzeczywistych zmian LINQ to SQL uruchamia transakcję hermetyzowaną serią poszczególnych poleceń.
Zmiany w obiektach są tłumaczone pojedynczo na polecenia SQL i wysyłane na serwer.
W tym momencie wszelkie błędy wykryte przez bazę danych powodują zatrzymanie procesu przesyłania i zgłaszany jest wyjątek. Wszystkie zmiany w bazie danych są wycofywane tak, jakby nigdy nie wystąpiły żadne przesłania. Nadal DataContext ma pełne nagranie wszystkich zmian. W związku z tym możesz spróbować rozwiązać problem i wywołać SubmitChanges go ponownie, tak jak w poniższym przykładzie kodu.
Przykład
Po pomyślnym DataContext zakończeniu transakcji wokół przesłania obiekt akceptuje zmiany, ignorując informacje o śledzeniu zmian.
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