Вопрос по entity-framework, c#, transactions – Как откатить транзакцию в Entity Framework

9
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.
    }

Или, может быть, это делается автоматически, что означает, что в случае возникновения ошибки фиксация изменений отменяется для всех изменений. это?

Ваш Ответ

2   ответа
8

что до вызова context.SaveChanges транзакция не начинается. Я ожидаю, что Исключение от этого вызова автоматически откатит любую транзакцию, которую он начал. Альтернативы (если вы хотите контролировать транзакцию) [изJ.Lerman's Programming Entity Framework & quot; O 'Reilly, pg. 618]

using (var transaction = new System.Transactions.TransactionScope())
{
  try
  {
    context.SaveChanges();
    transaction.Complete();
    context.AcceptAllChanges();
  }
  catch(OptimisticConcurrencyException e)
  {
    //Handle the exception
    context.SaveChanges();
  }
}

или же

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

}
& quot; Я верю & quot; то, что? Shimmy
По сути, я полагаю, что вы получаете бесплатный откат транзакции в простом сценарии и что вам нужно будет обрабатывать транзакции, как показано в двух примерах для более сложных сценариев. Ваше примерное приложение, кажется, подтверждает это. Извините, если моя формулировка была менее чем звездной - была промежуточная встреча, когда я написал это вчера.
12

Я создал пример приложения, подобный примеру из вопроса и послесловий, которые я проверил в БД, и ни один пользователь не был добавлен.

Conclusion: ObjectContext.SaveChange it's automatically a transaction.

Note: Я считаю, что транзакции будут необходимы при выполнении sprocs и т. Д.

да это правильно

Похожие вопросы