当各层之间关闭contex时,EF 6中的事务管理

时间:2014-12-09 04:02:57

标签: c# entity-framework asp.net-mvc-4 transactions

我有一个由数据访问层(DAL),业务层和表示层组成的解决方案。 我在DAL中创建数据上下文如下:

using(var context = new DBContext){ ....  }

对于一个完整的流程说'购买',我必须不断在层之间移动。我希望在使用事务处理的过程中,在业务层或DAL中引发任何异常时,还原所有更改。但我的问题是,当我从DAL迁移到业务层时,相应的上下文会被释放。那么在这种情况下如何管理事务。我的设计有什么问题。

如果您有相同的链接,请分享链接,这将有所帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

您有多种选择,例如我已经在生产系统中看到了以下所有策略:

  1. 假设单线程使用,您可以将DbContext的生命周期延长到数据访问层之外,以便它由调用层管理(IoC容器可能在此用于保存传递(I)DbContext周围,每个请求/每线程类型实例化)。 carying DbContext的潜在好处是,如果AsNoTracking()被取消,它可以兼作缓存。使用最终SaveChanges()作为提交点。
  2. 保持您的设计不变,而是在您的业务(或更高)层中使用System.Transactions.TransactionScope,然后将所有DAL和其他事务代码包装在一个工作单元中。 TS的好处是许多底层数据库和队列适配器与ts无缝协作,因此您可以将事务边界作为事后考虑,并使用多种DAL技术,TS将处理单阶段和分布式ACID事务。
  3. 创建自己的UnitOfWork模式,其中包含DbContext。这实际上只是选项1的包装。
  4. 为简单起见,我通常总是使用TransactionScope - 这就是它的设计目的,如果您的设计发生变化(例如您的数据分布在多个数据库中),它还允许您控制分布式ACID事务)。有一些事情you do need to know about TS,例如默认的隔离级别可能过于热心,并且您希望确保关闭每个连接,然后在单个线程上打开另一个连接以轻量级事务管理器{/ 3}}

    修改更多关于obtain the benefit

    的所有细则