如何延迟在EF6中打开交易?

时间:2019-10-01 11:25:37

标签: asp.net-mvc transactions entity-framework-6 autofac entity-framework-plus

我们使用ASP.Net MVC + Autofac + EF6。 DbContext由UnitOfWork包装。我们通过Autofac为每个http请求创建它。 我们还在UnitOfWork构造函数中为整个http请求打开事务。

问题在于,并非所有http请求都必须包装在事务中。其中一些甚至没有向数据库的请求。

我们希望将事务打开延迟到对DB的第一个实际请求。 有什么想法可以做到吗?

我们可以覆盖SaveChages并在保存之前打开事务,但是选择查询不会以这种方式在事务中执行。

这里的另一个问题是:我们将EF Plus的全局过滤器用于可移动的软实体。它工作良好,但是针对上下文的过滤器初始化相当慢。我们也希望将其延迟到对DB的第一个实际请求。

1 个答案:

答案 0 :(得分:1)

问题在于,尽管已调用某个动作,但您的UnitOfWork仍被注入到控制器中,因此即使您不需要使用它,其构造函数也总是被调用。一种解决方案是使用Autofac lazy injection。在这种情况下,UnitOfWork的构造函数仅在需要其实例时被调用

public class SomeController : Controller {
    //..
    private readonly Lazy<IUnitOfWork> _unitOfWork;

    private IAnotherService UnitOfWork => _unitOfWork.Value;

    public SomeController(
        //..
        Lazy<IUnitOfWork> unitOfWork
        )
    {
        //..
        _unitOfWork = unitOfWork;
    }

    //..
    public ActionResult ActionNeedsTransaction()
    {
        //use UnitOfWork

        UnitOfWork.SaveChanges();

        return Json(value);
    }

}