2011-12-28 55 views
5

假如我是在同一时间将在下面的表中的记录现在
表1
表2
表3
表4
表5如何在LINQ的maintan交易的entites

我想要做的是,在情况的任何异常或错误的插入在表3中发生,然后记录它之前被插入(例如,在表1和表2)必须是回滚...

如何一世像这样管理交易?

回答

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

烨@scartag感谢好友得到了我的答案,谢谢:) – 2011-12-28 09:49:19

4

这是实体框架4

默认行为,该交易隐含..只要你拨打的SaveChanges任何错误都将触发回滚。

+0

能否手动处理它?实际上Table1的PrimaryKey是Table2的ForeignKey,Table2的PK是Table3的FK,等等......那么它将如何工作? – 2011-12-28 09:29:25

+0

@DotNetIsMyPower你需要关联它们。如同这些字段已经可用那样指定这种关联。 Table2.Prop = Table1.Prop;等 – scartag 2011-12-28 09:33:51

+0

但他们在不同的模型。尽管让我试试。快速回复 – 2011-12-28 09:37:19