【问题标题】:Transaction scope in EF Repository?EF存储库中的事务范围?
【发布时间】:2011-06-19 06:38:56
【问题描述】:

我在 EF 中使用存储库模式。在我的项目中,我们使用两个数据库,这两个数据库位于两个不同的项目中。在任何时候,一个项目都是 CoreLib(我们指的是另一个项目)。我有以下问题。

  1. 我可以为两个项目使用一个存储库层吗?
  2. 如何使用 System.Transactions.TransactionScope 提供事务安全性? 注意:我使用的是微软的统一框架和 UnitOfWork 模式。

感谢您的回复。我已经实现了在事务范围内保存上下文更改的功能。每次,它都会抛出以下异常。

{"Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool."}

我认为这与 MSDTC 配置有关,我在客户端和 SQL 服务器机器中配置了网络 DTC 访问。配置如下。

Network DTS access  - Enabled.
Allow Remote Clients    - Enabled.
Allow Remote Administration – Enabled.
Allow Inbound   - Enabled.
Allow outbond   - Enabled.
No Authentication Required – Enabled.

在配置 MSDTC 时我有什么遗漏吗?

还有一个问题:此配置是否与域配置相关联? 因为在我们的环境中,我的数据库服务器没有用它的名字解析(我们使用的是 IP 地址)。

【问题讨论】:

  • 我已将您未注册的帐户合并到您的注册帐户中。您现在应该能够编辑您的问题,将 cmets 留在单独的答案下,并最终接受对您最有帮助的答案。

标签: entity-framework repository-pattern


【解决方案1】:

我可以为两个项目使用一个存储库层吗?

是的。

如何使用 System.Transactions.TransactionScope 提供交易安全性?注意:我使用的是微软的统一框架和 UnitOfWork 模式。

根据业务需要在业务层中使用事务划分(做所有必须在事务范围内的一个事务中的事情)。

因为您使用的是 UnitOfWork 模式。

  1. 工作单元与事务无关(在 db 意义上)。工作单元决定了ObjectContext 的生命周期。您可以随意创建 TransactionScope。无论您是在创建工作单元之后还是之前创建它都没有关系。
  2. 由于 UnityFW 是一个 ioc 容器,因此可以使用业务方法上的属性进行事务划分。

关于交易和 EF 的一些内容:

  1. 事务与 DbConnections 一起工作,与 EF 没有太大关系。
  2. 如果所有相关的驱动程序都支持 2 阶段提交,您可以将旧的 SQL 内容与 EF 内容甚至多个数据库混合在一个事务中。
  3. ObjectContextSaveChanges 将参与一个全局事务。如果没有全局事务,它将创建一个新事务,保存所有内容并提交或回滚。

【讨论】:

    【解决方案2】:

    你可以做这样的事情。假设你的两个数据库上下文被命名为FirstContext andSecondContext`

    public class ContextFacade : IUnitOfWork // your Unit of work interface
    {
      FirstContext _fc;
      SecondContext _sc
      public ContextFacade(FirstContext fc, SecondContext sc)
      {
         _fc = fc;
         _sc = sc;
      }
    
      public void SaveChanges()
      {
        var scope = new TransactionScope(TransactionScopeOption.Required, options);
        using(scope)
        {
          _fc.SaveChanges();
          _sc.SaveChanges()
    
          scope.Complete();
        }
      }
    }
    

    查看Ladislav Mrnka's answer,了解如何将所有这些组合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多