EF6事务回滚

3
我们正在扩展上下文对象,使其能够与另一个系统同步功能。我们目前正在savechanges中进行此操作。但是,我们意识到当上下文在事务状态下使用begintransaction进行多次调用savechanges时,存在一种情况,我们不希望同步数据直到整个过程完成。我们考虑在上下文的dispose操作中执行此操作。
唯一的问题是如何知道事务是否成功。如果成功了,那么就可以同步。如果回滚了,那么当然不需要同步。在上下文被dispose时,我们如何知道事务的状态?
3个回答

1

如果你的模型需要同步,可以实现一个接口,例如iSyncable,承诺只要模型成功保存,就会进行同步。如果你有相关的表格通过导航属性连接,保存所有内容并将其放入导航属性中,然后再进行同步,以便同步函数拥有所需的所有对象。

顺便提一下,如果你需要进行任何数据转换,这就是你可以做到的地方。


1

谢谢您。这正是我需要用于其中部分的东西。我希望我能将两者都标记为答案。 - vbjay

0

不要在dispose方法中这样做。Disposal是用于清理的。请使用以下模式:

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

这就是你需要做的全部。


我们在使用事务时没有处理它。我们在继承的上下文对象内部。 - vbjay
1
这正是析构函数的用途:解决一些松散的问题,比如关闭连接,只要对象存在就必须强制打开,完成最终任务,以及执行在完成对象(在本例中为上下文)之前无法完成的任务。考虑到他需要进行多次保存,然后进行最终同步,似乎他希望这是一个自动过程,消费者不必调用它或对结束透明,并且不能依赖于保存的频率。另一种选择是扩展模型,使其在处理或作用域关闭时执行“任何”操作。 - user4593252
然后他应该包装上下文。通过继承来实现这一点并不是继承的目的。这会破坏可替换性;Dispose 不应该执行可能会抛出异常的操作。这是因为如果使用/finally 块被异常退出,新异常将替换旧异常;一旦放弃通过继承来实现这个人为要求,解决方案就非常简单了。 - usr
1
是的,没错。那接口呢?它是一个承诺去做某事,他需要在某个时候承诺同步。 - user4593252
MetalPhoenix说得对。我们已经找到了一个可能的解决方案,而不需要在上下文中处理它。我们会让你知道的。但是,我们仍然很想知道是否可能。 - vbjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接