【问题标题】:EF6 Transaction RollbackEF6 事务回滚
【发布时间】:2015-07-21 15:56:38
【问题描述】:

我们正在扩展上下文对象以具有与另一个系统的同步功能。我们目前正在 savechanges 中执行此操作。然而,我们意识到存在一种情况,即上下文将在事务状态中使用,使用 begintransaction 并多次调用 savechanges。在整个过程完成之前,我们不想同步数据。我们考虑在处理上下文时这样做。

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

【问题讨论】:

    标签: .net entity-framework transactions entity-framework-6


    【解决方案1】:

    让您的模型需要同步来实现一个接口,例如 iSyncable,该接口承诺您将在模型成功保存后立即同步。如果您通过导航属性拥有相关表,请保存所有内容并将其放入导航属性中,然后再进行同步,以便您的同步函数拥有它需要的所有对象。

    顺便说一句,如果您需要进行任何数据转换,这就是您要做的地方。

    【讨论】:

      【解决方案2】:

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

      MSDN IEnlistmentTransaction

      【讨论】:

      • 谢谢你。这正是我需要用于其中的一部分。我希望我可以将两者都标记为答案。
      【解决方案3】:

      不要在 dispose 方法中这样做。处置是为了清理。使用以下模式:

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

      这就是你需要做的。

      【讨论】:

      • 我们在使用事务时不处理。我们在继承的上下文对象中。
      • 这正是解构器的用途:捆绑松散的末端,例如关闭连接,只要对象存在就必须强制打开,完成任务,执行在完成之前无法完成的任务与对象(在本例中为上下文)。鉴于他需要进行多次保存,然后进行最终同步,他似乎希望它是一个自动过程,消费者不必调用它,或者到最后是透明的,并且不能指望保存的频率。另一种方法是扩展模型,使其在处置或范围关闭时执行“任何操作”。
      • 那么他应该包装上下文。通过继承来做到这一点并不是继承的目的。这打破了可替代性。 Dispose 不应该做一些可以抛出的事情。这是因为如果可能存在的 using/finally 块被异常退出,则新异常将替换旧异常。一旦放弃了通过继承进行此操作的人为要求,解决方案就非常简单。
      • 是的,没错。接口呢?这是做某事的承诺,他需要在某个时候承诺同步。
      • MetalPhoenix 说得对。我们已经找到了一个可能的解决方案,而无需在上下文中进行处理。会让你知道。但是,我们很想知道它是否仍然可行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 2016-09-09
      • 2012-12-30
      相关资源
      最近更新 更多