Вопрос

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

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

Это было полезно?

Решение

ОК

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

Заключение:ObjectContext.SaveChange - это автоматически транзакция.

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

Другие советы

Я считаю (но я не являюсь давним экспертом в EF), что до тех пор, пока не будет выполнен вызов context.SaveChanges, транзакция не будет запущена.Я бы ожидал, что Исключение из этого вызова автоматически откатит любую транзакцию, которую оно запустило.Альтернативы (на случай, если вы хотите контролировать транзакцию) [из Дж.Лерман "Programming Entity Framework" О'Рейли, стр.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();
    }
  }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top