Útmutató: Módosítások elküldése az adatbázisba
Függetlenül attól, hogy hány módosítást végez az objektumokon, a módosítások csak a memórián belüli replikákon történnek. Nem módosította az adatbázisban lévő tényleges adatokat. A módosítások csak akkor kerülnek továbbításra a kiszolgálóra, ha kifejezetten meghívja SubmitChanges a kiszolgálót DataContext.
A hívás során a DataContext rendszer megpróbálja a módosításokat egyenértékű SQL-parancsokra lefordítani. A műveletek felülbírálásához használhatja a saját egyéni logikáját, de a beküldés sorrendjét az DataContext úgynevezett változásfeldolgozó egy szolgáltatása vezényli. Az események sorrendje a következő:
Híváskor SubmitChangesa LINQ az SQL-hez megvizsgálja az ismert objektumok készletét annak megállapításához, hogy új példányok lettek-e hozzájuk csatolva. Ha vannak ilyenek, ezeket az új példányokat a rendszer hozzáadja a követett objektumok készletéhez.
A függőben lévő módosításokat tartalmazó objektumok mindegyike objektumsorozatba van rendezve a közöttük lévő függőségek alapján. Azok az objektumok, amelyek változásai más objektumoktól függnek, a függőségek után sorrendbe kerülnek.
Közvetlenül a tényleges módosítások továbbítása előtt a LINQ az SQL-be elindít egy tranzakciót az egyes parancsok sorozatának beágyazásához.
Az objektumok módosításait a rendszer egyenként lefordítja az SQL-parancsokra, és elküldi a kiszolgálónak.
Ezen a ponton az adatbázis által észlelt hibák miatt a beküldési folyamat leáll, és kivétel keletkezik. Az adatbázis minden módosítása vissza lesz állítva, mintha soha nem történt volna beküldés. A DataContext módosítások teljes felvétele továbbra is folyamatban van. Ezért megpróbálhatja kijavítani a problémát, és újra meghívni SubmitChanges , ahogy az alábbi kód példában is látható.
Példa
Ha a beküldés körüli tranzakció sikeresen befejeződött, a DataContext változáskövetési információk figyelmen kívül hagyásával elfogadja az objektumok módosításait.
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