如何在Linq To Entities中维护交易

时间:2011-12-28 09:23:01

标签: c# linq transactions linq-to-entities

假设我在同一时间在以下表中插入记录
表1
表2
表3
表4
表5

现在我想要做的是,如果在表3中插入期间发生任何异常或错误,那么在此之前插入的记录(例如表1和表2中)必须回滚...

我该如何管理这样的交易?

2 个答案:

答案 0 :(得分:4)

这是Entity Framework 4的默认行为

事务是隐式的..一旦调用savechanges,任何错误都会触发回滚。

答案 1 :(得分:3)

默认情况下,SaveChanges将在事务中执行(请参阅文档中的Remarks part

如果您想要更多地控制事务,可以将savechanges块包装在TransactionScope中。然后,SaveChanges将获取您的环境事务并使用该事务。

当您需要分布式事务时(例如,使用多个上下文或使用WCF),这可能很有用。

正如您提到的那样,您使用不同的模型,您将在一个TransactionScope中使用两个ObjectContexts(并使用some logic和AcceptAllChanges)

您的代码将如下所示:

using (TransactionScope scope = new TransactionScope()) 
{ 
    //Do something with context1 
    //Do something with context2


    //Save Changes but don't discard yet 
    context1.SaveChanges(false); 

    //Save Changes but don't discard yet 
    context2.SaveChanges(false);


    //if we get here things are looking good. 
    scope.Complete(); 

    //If we get here it is save to accept all changes. 
    context1.AcceptAllChanges(); 
    context2.AcceptAllChanges();
 }