EF Repository中的事务范围?

时间:2011-06-19 06:38:57

标签: entity-framework repository-pattern

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

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

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

    {"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地址)。

2 个答案:

答案 0 :(得分:1)

  

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

  

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

在业务层中使用事务划分,因为业务需要它(在事务管理器中执行必须在一个事务中的所有事务)。

因为您正在使用UnitOfWork模式。

  1. 工作单元与事务无关(在db意义上)。工作单元确定 ObjectContext 的生命周期。您可以根据需要创建TransactionScope。如果您在创建工作单元之后或之前创建它,则无关紧要。
  2. 由于UnityFW是一个ioc容器,因此可以使用业务方法的属性进行事务划分。
  3. 关于交易和EF的一些事情:

    1. 交易使用 DbConnections 并且与EF无关。
    2. 如果所有涉及的驱动程序都支持2阶段提交,您可以将旧的SQL内容与EF内容混合,甚至可以在一个事务中混合使用多个数据库。
    3. ObjectContext
    4. SaveChanges 将参与全局事务。如果没有全局事务,它将创建一个新事务,保存所有内容并提交或回滚。

答案 1 :(得分:0)

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

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如何将所有这些组合在一起。