【问题标题】:Suppressing TransactionScope enlistment of a readonly EF context?抑制只读 EF 上下文的 TransactionScope 登记?
【发布时间】:2010-08-23 20:19:58
【问题描述】:

我有一个场景,我需要打开多个指向不同数据库的数据上下文。我只是写入其中一个数据库并从其他数据库中读取......所以从技术上讲,事务应该只针对其中一个数据库。

我想避免将 TransactionScope 升级为分布式事务,这样我就不必担心 MSDTC ...有没有办法让事务中只有一个上下文登记?

【问题讨论】:

    标签: .net entity-framework datacontext transactionscope msdtc


    【解决方案1】:

    我不确定这是否会将第二个连接纳入事务,但您可以尝试在您的选择中抑制事务范围:

    using (new TransactionScope(TransactionScopeOption.Suppress))
    {}
    

    【讨论】:

    • 我感觉这个方法可能会失败,因为当 DataContext 进入没有环境事务的范围并提交更改时,它很可能会关闭其关联的连接对象。不过,这仅适用于单个数据上下文......为一个数据上下文的操作隐藏事务范围,同时允许它们在另一个数据上下文上进行操作应该没问题。
    【解决方案2】:

    我一直在研究 Linq to Sql 的类似问题 - 最初我们的解决方案是对每个请求使用相同的连接。 Rick Strahl 在这方面发表了一系列博文,值得一看。

    在我们的解决方案中,DataContext 构造函数有一个重载的构造函数,它从工厂检索连接(如果不存在连接,则传递的连接存储在线程上)

    public DataContext1(connection)
        : base (ConnectionFactory.GetConnectionFromContext(connection))
    {
    }
    

    这似乎在 WCF 场景中工作正常,连接工厂可以存储/从 ServiceModel.OperationContext.Items 集合中检索,并且(更重要的是)订阅 OperationComplete 事件以关闭/释放线程上的连接当所有操作都完成后。

    我发现我们还需要扩展连接对象,以便您可以防止在处理拥有的数据上下文时(例如,在每个操作范围完成后)自动关闭/处理内部连接。

    我现在正在研究非 WCF 场景...... TBH 它并不漂亮。我们也没有 WCF 上下文中的“OperationCompleted”事件触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2013-01-12
      • 2019-12-05
      • 1970-01-01
      相关资源
      最近更新 更多