2009-07-01 3 views
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. 
    } 

Возможно, это делается автоматически, что означает, что при возникновении ошибки внесение изменений отменяется для всех изменений. не так ли?Как отменить транзакцию в Entity Framework

ответ

12

OK

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

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

Примечание: Я считаю, что операции будут необходимы, если исполняющие sprocs и т.д.

+0

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

8

Я верю (но я долгое время эксперт в области EF), что до вызова контекста. Произошла транзакция, транзакция не началась. Я ожидаю, что Исключение из этого вызова автоматически отменит любую транзакцию, с которой она началась. Альтернативы (в случае, если вы хотите контролировать транзакцию) [от J.Lerman's "Programming Entity Framework" O'Reilly, стр. 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(); 
    } 
    } 

} 
+0

«Я верю», что что? – Shimmy

+0

По сути, я считаю, что вы получаете бесплатный откат транзакций в простом сценарии и что вам нужно будет обрабатывать транзакции, как показано в двух примерах для более сложных сценариев. Ваше примерное приложение, похоже, подтверждает это. Извините, если моя формулировка была меньше, чем звездная, - было между совещаниями, когда я написал это вчера. – FOR

Смежные вопросы