簡體   English   中英

如何延遲在 EF6 中打開事務?

[英]How to delay transaction open in EF6?

我們使用 ASP.Net MVC + Autofac + EF6。 DbContext 由 UnitOfWork 包裝。 我們通過 Autofac 為每個 http 請求創建它。 我們還在 UnitOfWork 構造函數中為整個 http 請求打開事務。

問題是並非所有 http 請求都必須包含在事務中。 他們中的一些人甚至沒有對 DB 的請求。

我們想將事務打開延遲到對 DB 的第一個實際請求。 任何想法如何做到這一點?

我們可以覆蓋 SaveChages 並在保存之前打開事務,但是 select 查詢不會在事務中執行。

這里還有一個問題:我們使用 EF Plus 的全局過濾器來處理軟可移動實體。 它工作得很好,但是上下文的過濾器初始化相當慢。 我們也想將它推遲到對 DB 的第一個實際請求。

問題是您的UnitOfWork被注入 controller 盡管調用了一個動作,因此即使您不需要使用它,它的構造函數也總是被調用。 一種解決方案可能是使用 Autofac 惰性注入 在這種情況下, 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);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM