使用UnitOfWork和EF处理事务

时间:2013-07-19 20:02:59

标签: asp.net-mvc entity-framework unit-of-work

我正在使用Entity Framework 5.0和MVC4。我有几个域名。他们每个人都有自己的DbContext(使用适当的表),存储库和服务。我还实现了UnitOfWork。

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

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

  1. 我必须在控制器中使用UnitOfWork并在最后调用Save方法(我不喜欢这个想法)。
  2. 创建一些服务,我将拥有UnitOfWork并访问这两个服务(实际上它与上面的解决方案相同,但我正在将逻辑移到单独的类中)
  3. 我必须在控制器内创建额外的TransactionScope并在最后提交
  4. 请告诉我您认为最好的选项。如果您有上述三项以外的任何内容,请告知我们。或者我的概念可能有问题?我的意思是域名和他们的数据库上下文?

1 个答案:

答案 0 :(得分: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();
}