簡體   English   中英

在ASP.Net Core中每個請求一次創建EF Core上下文

[英]Create EF Core Context once per request in ASP.Net Core

在閱讀了大量有關該主題的內容之后,似乎一個好的方法是為每個請求創建一個上下文。

為此,我在Startup.cs中聲明了兩個靜態對象

public class Startup
{
    public static DbContextOptionsBuilder<MCContext> optionsBuilder = new DbContextOptionsBuilder<MCContext>();
    public static MCContext db = null;

然后在應用啟動時使用init optionsBuilder初始化(因此只有一次):

public Startup(IConfiguration configuration)
{
    optionsBuilder.UseSqlServer(configuration["ConnectionStrings:DefaultConnection"]);
}

而db每次請求時:

app.Use(async (context, next) =>
{
    db = db ?? new MCContext(optionsBuilder.Options);
    await next.Invoke(); 
});

然后,當我需要控制器或剃須刀頁面cs中的上下文時,可以使用Startup.db獲取它:

User cur = await Startup.db.User.Where(x => x.Id == uid).FirstOrDefaultAsync();

我不按照這里處置上下文

因為我不熟悉DI,所以我想知道這種方法是否正確,或者是否缺少任何東西。

基於EF Core 2.0的新增功能-EF Core | 微軟文檔

如果您希望每個請求一次新的上下文:AddDbContext

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContext<MCContext >(
     options => options.UseSqlServer(connectionString));
 }

那么你也能

public class TiketsController : ControllerBase
{
    private readonly MCContext _context;

    public TiketsController (MCContext context)
    {
        _context = context;
    }
 }

在ASP.NET Core應用程序中使用EF Core的基本模式通常包括將自定義DbContext類型注冊到依賴項注入系統中,然后通過控制器中的構造函數參數獲取該類型的實例。 這意味着將為每個請求創建一個新的DbContext實例。

但是如果您需要高性能/安全重用:AddDbContextPool

public void ConfigureServices(IServiceCollection services)
{
 services.AddDbContextPool<MCContext >(
     options => options.UseSqlServer(connectionString));
 }

那么你也能

public class TiketsController : ControllerBase
{
    private readonly MCContext _context;

    public TiketsController (MCContext context)
    {
        _context = context;
    }
 }

如果使用此方法,則在控制器請求DbContext實例時,我們將首先檢查池中是否有可用的實例。 請求處理完成后,實例上的任何狀態都會重置,實例本身會返回到池中。

如果您不創建對象,請不要處置它。 讓IOC容器處理它。

順便說一句,我認為不需要這段代碼。 MCContext是一個依賴項,因此它的實例創建和注入由IOC容器完成。

app.Use(async (context, next) =>
{
    db = db ?? new MCContext(optionsBuilder.Options);
    await next.Invoke(); 
});

暫無
暫無

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

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