0

我正在使用实体框架 5.0 和 MVC4。我有几个域。它们中的每一个都有自己的 DbContext(使用适当的表)、存储库和服务。我还实现了 UnitOfWork。

在一项服务中为特定域处理特定的事务流很简单。我正在对表进行一些操作,最后我正在调用 UnitOfWork.Save,它的行为类似于 Transaction.Commit。

但是假设我有一个案例,我必须为两个不同的域调用操作,并且这两个操作必须放在一个事务中。我可以从控制器访问域的服务,因此从那里调用此操作。目前我可以看到三个解决方案:

  1. 我必须在控制器中有 UnitOfWork 并在最后调用 Save 方法(我不喜欢这个想法)。
  2. 创建一些服务,我将在其中拥有 UnitOfWork 并访问这两个服务(实际上它与上面的解决方案相同,但我将逻辑移动到单独的类)
  3. 我必须在控制器内创建额外的 TransactionScope 并在最后提交

请让我知道您认为最好的选择。如果你有以上三个以外的,请告诉我。或者也许我的概念有问题?我的意思是域及其数据库上下文?

4

1 回答 1

0

假设您的 UnitOfWork 实现支持 .NET 中的普通事务,您可以执行以下操作,它们应该注册当前正在运行的事务。

protected TransactionScope CreateTransactionScope()
{
    var options = new TransactionOptions();
    options.IsolationLevel = IsolationLevel.ReadCommitted;
    options.Timeout = TransactionManager.MaximumTimeout;
    return new TransactionScope(TransactionScopeOption.Required, options);
}

using (var scope = this.CreateTransactionScope())
{
    // do operations with context 1
    // do operations with context 2

    scope.Complete();
}
于 2013-07-19T21:14:37.927 回答