如何延迟在 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);
}
}
我们使用 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);
}
}