Procédure : Soumettre des modifications à la base de données
Indépendamment du nombre de modifications apportées aux objets, celles-ci sont apportées uniquement aux réplicas en mémoire. Vous n'avez pas apporté de modifications aux données effectives dans la base de données. Vos modifications ne sont pas transmises au serveur tant que vous n'appelez pas explicitement SubmitChanges sur le DataContext.
Lorsque vous effectuez cet appel, le DataContext essaie de traduire vos modifications en commandes SQL équivalentes. Vous pouvez utiliser votre propre logique personnalisée pour substituer ces actions, mais l’ordre de soumission est géré par un service du DataContext connu sous le nom de processeur de modification. La séquence d'événements se décompose comme suit :
Lorsque vous appelez SubmitChanges, LINQ to SQL examine l’ensemble d’objets connus pour déterminer si de nouvelles instances ont été attachées. Le cas échéant, ces nouvelles instances sont ajoutées au jeu d'objets suivis.
Tous les objets qui ont des modifications en attente sont organisés dans une séquence d'objets en fonction de leurs dépendances. Les objets dont les modifications dépendent d'autres objets sont classés d'après leurs dépendances.
LINQ to SQL démarre une transaction pour encapsuler la série de commandes individuelles, juste avant que toutes les modifications réelles soient transmises.
Les modifications apportées aux objets sont traduites une par une en commandes SQL et sont envoyées au serveur.
À ce stade, toutes les erreurs détectées par la base de données interrompent le processus de soumission et une exception est levée. Toutes les modifications apportées à la base de données sont restaurées comme si aucune soumission ne s'était produite. Le DataContext a encore un enregistrement complet de toutes les modifications. Par conséquent, vous pouvez essayer de résoudre le problème et d'appeler encore SubmitChanges, comme dans l'exemple de code qui suit.
Exemple
Lorsque la transaction autour de la soumission a réussi, le DataContext accepte les modifications apportées aux objets en ignorant les informations de suivi des modifications.
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