Avec Entity Framework, la plupart du temps SaveChanges()
est suffisant. Cela crée une transaction ou s'inscrit dans une transaction ambiante et effectue tout le travail nécessaire dans cette transaction.
Parfois, même si l' SaveChanges(false) + AcceptAllChanges()
association est utile.
L'endroit le plus utile pour cela est dans les situations où vous souhaitez effectuer une transaction distribuée dans deux contextes différents.
C'est à dire quelque chose comme ça (mauvais):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
Si context1.SaveChanges()
réussit mais context2.SaveChanges()
échoue, la transaction distribuée entière est abandonnée. Mais malheureusement, Entity Framework a déjà ignoré les modifications context1
, vous ne pouvez donc pas rejouer ou enregistrer efficacement l'échec.
Mais si vous changez votre code pour qu'il ressemble à ceci:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
Pendant que l'appel à SaveChanges(false)
envoie les commandes nécessaires à la base de données, le contexte lui-même n'est pas modifié, vous pouvez donc le refaire si nécessaire, ou vous pouvez interroger le ObjectStateManager
si vous le souhaitez.
Cela signifie que si la transaction lève réellement une exception, vous pouvez compenser, en réessayant ou en enregistrant l'état de chaque contexte ObjectStateManager
quelque part.
Voir mon article de blog pour en savoir plus.
SaveChanges(fase); ... AcceptAllChanges();
était un modèle en premier lieu. Remarquez comment la réponse acceptée à la question ci-dessus est écrite par l'auteur d'un blog - et ce blog est référencé dans l'autre question. Tout se rassemble.