2015-07-21 134 views
3

我们正在扩展上下文对象以与另一个系统具有同步功能。我们目前正在使用savechanges进行此操作。但是,我们意识到有一种情况是,在使用begintransaction进行事务处理的情况下,会使用多个调用来保存更改。我们不希望在完成整个过程之前同步数据。我们认为要在处理上下文时做到这一点。EF6事务回滚

我们有的一个问题是知道交易是否成功。如果成功了,那么很好的同步。如果它回滚了,那么我们当然不想同步。在处理上下文时,我们如何知道事务的状态?

回答

1

让你的模型需要同步来实现一个接口,例如iSyncable,它承诺一旦模型成功保存,你就会同步。如果您通过导航属性具有相关表格,请保存所有内容并将其放入导航属性中,然后再进行同步,以使您的同步功能具有所需的所有对象。

顺便说一句,如果你需要做任何数据转换,这将是你做的地方。

0

不要在dispose方法中执行此操作。处置是清理。使用以下模式:

using (var tran = new TransactionScope()) 
using (var db = new MyContext()) 
{ 
db.Connection.Open(); 
DoWork(db); 
tran.Complete(); 
} 

这就是你需要做的。

+0

我们没有在使用交易时处理它。我们在继承的上下文对象中。 – vbjay

+1

这正是解构器的作用:捆绑松散的末端,如关闭连接,只要对象存在,必须强制打开,完成事情并执行直到完成对象才能完成的任务(在这种情况下,上下文)。鉴于他需要进行多次保存然后进行最终同步,似乎他希望它是一个自动过程,消费者不必调用它,或者对最终透明,并且不能指望保存的频率。另一种方法是扩展模型,使其在处置或范围上“无论”。 – MetalPhoenix

+0

然后他应该包装上下文。通过继承来做这件事并不是继承。这打破了可替代性。处置不应该做一些可以抛出的东西。这是因为如果可能出现的使用/ finally块被一个异常退出,那么新的异常将取代旧的异常。一旦通过继承进行这种人为要求被放弃,解决方案就非常简单。 – usr

1

您需要在事务管理器中登记您的操作以接收与事务相关的通知。

MSDN IEnlistmentTransaction

+0

谢谢你。这正是我需要使用它的一部分。我希望我可以将两者都标记为答案。 – vbjay