如何延迟在 EF6 中打开事务?

How to delay transaction open in EF6?

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

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

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

我们可以重写 SaveChages 并在保存前打开事务,但是 select 查询不会以这种方式在事务中执行。

这里还有一个问题:我们使用 EF Plus 的全局过滤器来处理软可移动实体。它工作得很好,但是上下文的过滤器初始化相当慢。我们也想将其延迟到对 DB 的第一个实际请求。

问题是,尽管调用了一个动作,但您的 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);
    }

}