Comment annuler une transaction dans Entity Framework
-
21-08-2019 - |
Question
string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" };
using (Entities context = new Entities())
{
foreach (string user in usersToAdd)
{
context.AddToUsers(new User { Name = user });
}
try
{
context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist.
}
catch (Exception e)
{
//Roll back all changes including the two previous users.
}
Ou peut-être cela se fait automatiquement, ce qui signifie que si une erreur se produit, les modifications sont annulées pour commettre des tous les changements. est-il?
La solution
OK
J'ai créé un échantillon d'une application comme l'exemple de la question et postfaces je suis arrivé dans la DB et aucun utilisateur ont été ajoutés.
Conclusion: ObjectContext.SaveChange il est automatiquement une transaction
.Remarque:. Je crois que les transactions seront nécessaires si l'exécution sprocs etc
Autres conseils
Je crois (mais je ne suis pas expert de longue date dans EF) que jusqu'à l'appel à context.SaveChanges passe par, la transaction ne démarre pas. J'attends une exception à cet appel serait automatiquement rollback toute opération qu'elle a commencé. Alternatives (dans le cas où vous voulez être dans le contrôle de la transaction) [de « Programmation Entity Framework » de J.Lerman O'Reilly, p. 618]
using (var transaction = new System.Transactions.TransactionScope())
{
try
{
context.SaveChanges();
transaction.Complete();
context.AcceptAllChanges();
}
catch(OptimisticConcurrencyException e)
{
//Handle the exception
context.SaveChanges();
}
}
ou
bool saved = false;
using (var transaction = new System.Transactions.TransactionScope())
{
try
{
context.SaveChanges();
saved = true;
}
catch(OptimisticConcurrencyException e)
{
//Handle the exception
context.SaveChanges();
}
finally
{
if(saved)
{
transaction.Complete();
context.AcceptAllChanges();
}
}
}