代码之家  ›  专栏  ›  技术社区  ›  Joel Martinez

是否取消只读EF上下文的TransactionScope登记?

  •  4
  • Joel Martinez  · 技术社区  · 14 年前

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

    我想避免将TransactionScope升级为分布式事务,这样我就不必担心MSDTC了…是否有任何方法可以在事务中只登记一个上下文?

    2 回复  |  直到 8 年前
        1
  •  1
  •   abatishchev Karl Johan    8 年前

    我一直在研究LinqToSQL的类似问题——最初我们的解决方案是在每个请求中使用相同的连接。Rick Strahl对此做了一系列值得一看的博客文章。

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

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

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

    我发现我们还需要扩展连接对象,以便在释放所属的DataContext时(例如,在每个操作范围完成之后),您可以防止内部连接的自动关闭/双封。

    我现在看的是非WCF场景…但它不漂亮。我们也没有wcf上下文中的“operationCompleted”事件触发器。

        2
  •  2
  •   Dan    14 年前

    我不确定这是否会将第二个连接登记到事务中,但您可以尝试取消所选的TransactionScope:

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