Comment annuler une transaction dans Entity Framework

c# entity-framework rollback savechanges transactions

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 que cela est fait automatiquement, ce qui signifie que si une erreur survient, les modifications validées sont annulées pour toutes les modifications. est-ce

Réponse acceptée

D'accord

J'ai créé un exemple d'application telle que celle de la question et les mots suivants ont été archivés dans la base de données et aucun utilisateur n'a été ajouté.

Conclusion: ObjectContext.SaveChange est automatiquement une transaction.

Remarque: Je pense que des transactions seront nécessaires si vous exécutez sprocs, etc.


Réponse populaire

Je crois (mais je ne suis pas un expert de longue date en EF) que jusqu'à l'appel de context.SaveChanges, la transaction n'est pas lancée. Je m'attendrais à ce qu'une exception à cet appel annule automatiquement toute transaction commencée. Alternatives (au cas où vous voudriez contrôler la transaction) [from "Framework 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();
    }
  }

}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow