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?

Était-ce utile?

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();
    }
  }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top