Sdílet prostřednictvím


Postupy: Odeslání změn do databáze

Bez ohledu na to, kolik změn v objektech provedete, se změny provádějí pouze u replik v paměti. Nepronesli jste žádné změny skutečných dat v databázi. Vaše změny se nepřenesou na server, dokud explicitně nezavoláte SubmitChanges DataContext.

Když toto volání provedete, DataContext pokusí se změny přeložit na ekvivalentní příkazy SQL. K přepsání těchto akcí můžete použít vlastní logiku, ale pořadí odeslání je orchestrováno službou označovanou DataContext jako procesor změn. Pořadí událostí je následující:

  1. Při volání SubmitChangesLINQ to SQL prozkoumá sadu známých objektů a určí, zda byly k nim připojeny nové instance. Pokud ano, tyto nové instance se přidají do sady sledovaných objektů.

  2. Všechny objekty, které mají čekající změny, jsou seřazeny do posloupnosti objektů na základě závislostí mezi nimi. Objekty, jejichž změny závisí na jiných objektech, jsou sekvencovány po jejich závislostech.

  3. Bezprostředně před přenosem skutečných změn spustí LINQ to SQL transakci, která zapouzdřuje řadu jednotlivých příkazů.

  4. Změny objektů se přeloží jeden po druhém do příkazů SQL a odešlou se na server.

V tomto okamžiku všechny chyby zjištěné databází způsobí zastavení procesu odeslání a vyvolá se výjimka. Všechny změny databáze se vrátí zpět, jako by se nikdy nesdílely žádné odeslání. Pořád DataContext máte úplný záznam všech změn. Můžete se tedy pokusit problém opravit a znovu zavolat SubmitChanges , jako v následujícím příkladu kódu.

Příklad

Po úspěšném DataContext dokončení transakce kolem odeslání přijme změny objektů ignorováním informací sledování změn.

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

Viz také