Procedure: Wijzigingen verzenden naar de database
Ongeacht het aantal wijzigingen dat u aanbrengt in uw objecten, worden wijzigingen alleen aangebracht in replica's in het geheugen. U hebt geen wijzigingen aangebracht in de werkelijke gegevens in de database. Uw wijzigingen worden pas naar de server verzonden als u de server expliciet aanroept SubmitChanges DataContext.
Wanneer u deze aanroep maakt, wordt geprobeerd DataContext uw wijzigingen te vertalen in gelijkwaardige SQL-opdrachten. U kunt uw eigen aangepaste logica gebruiken om deze acties te overschrijven, maar de volgorde van indiening wordt ingedeeld door een service van de DataContext bekende wijzigingsprocessor. De volgorde van gebeurtenissen is als volgt:
Wanneer u LINQ aanroept SubmitChanges, onderzoekt LINQ de set bekende objecten om te bepalen of er nieuwe exemplaren aan zijn gekoppeld. Als dit het geval is, worden deze nieuwe exemplaren toegevoegd aan de set bijgehouden objecten.
Alle objecten waarvoor wijzigingen in behandeling zijn, worden geordend in een reeks objecten op basis van de afhankelijkheden ertussen. Objecten waarvan de wijzigingen afhankelijk zijn van andere objecten, worden gesequentieerd na hun afhankelijkheden.
Direct voordat werkelijke wijzigingen worden verzonden, start LINQ naar SQL een transactie om de reeks afzonderlijke opdrachten in te kapselen.
De wijzigingen in de objecten worden één voor één vertaald naar SQL-opdrachten en naar de server verzonden.
Op dit moment worden eventuele fouten die door de database zijn gedetecteerd, ertoe geleid dat het indieningsproces wordt gestopt en er wordt een uitzondering gegenereerd. Alle wijzigingen in de database worden teruggedraaid alsof er geen inzendingen zijn opgetreden. De DataContext lijst bevat nog steeds een volledige opname van alle wijzigingen. U kunt daarom proberen het probleem op te lossen en opnieuw aan te roepen SubmitChanges , zoals in het volgende codevoorbeeld.
Opmerking
Wanneer de transactie rond de inzending is voltooid, accepteert de DataContext transactie de wijzigingen in de objecten door de informatie over het bijhouden van wijzigingen te negeren.
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