使用ApplicationDbContext和來自appsettings.json的DI

asp.net-core c# dependency-injection entity-framework-core

我試圖從我的ApplicationDbContext類中抽像出任何連接信息,以便我可以利用不同的數據庫進行開發,登台,生產。我首先從Startup.cs註冊一個服務

services.AddDbContext<ApplicationDbContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

我的ApplicationDbContext類:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
     : base(options)
   {
   }

    protected override void OnModelCreating(ModelBuilder builder)
    {
         base.OnModelCreating(builder);
    }
}

運行此應用程序時,我收到以下錯誤:

InvalidOperationException :無法創建類型為“SquadApps.Data.ApplicationDbContext”的實例。模型綁定的複雜類型不能是抽像或值類型,並且必須具有無參數構造函數。

所以我很自然地嘗試添加無參數構造函數

public ApplicationDbContext() { } 

現在又出現了另一個錯

InvalidOperationException :尚未為此DbContext配置任何數據庫提供程序。可以通過覆蓋DbContext.OnConfiguring方法或在應用程序服務提供程序上使用AddDbContext來配置提供程序。如果使用AddDbContext,那麼還要確保您的DbContext類型在其構造函數中接受DbContextOptions對象,並將其傳遞給DbContext的基礎構造函數。

如果我回到在ApplicationDbContext類中存儲連接字符串,如下所示:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("........");
}

然後一切正常,但顯然這不是理想的,可能是一個不好的做法。我認為DI過程中缺少一些東西,任何建議或建議都會受到讚賞。

熱門答案

解決方案原來是我試圖調用DI的方式。我錯誤地假設DI可以在我的控制器內的每個IActionResult中被調用,但實際上它必須在控制器的構造函數中發生。這使得DI可用於控制器內的所有IActionResult方法。

工作DI呼叫的示例:

public class HomeController : Controller
{
    private readonly ApplicationDbContext _ctx;
    private readonly CompanySettings _companySettings;

    public HomeController(ApplicationDbContext ctx, IOptions<CompanySettings> settings)
    {
        _ctx = ctx;
        _companySettings = settings.Value;
    }

    public IActionResult Index()
    {
        var model = new HomeViewModel();

        // _ctx and _companySettings can be used here

        return View(model);
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow