我應該把Database.EnsureCreated放在哪裡?

asp.net c# entity-framework-core

我有一個Entity Framework Core + ASP.NET Core應用程序,當我的應用程序啟動時,我想確保創建數據庫,並最終(一旦我​​有遷移)我想確保它們也運行。

最初我將Database.EnsureCreated()放入我的DbContext的構造函數中,但是每次有人點擊我的應用程序時它都會運行,因為DbContext都會創建一個新的DbContext實例。

我試著把它放到我的啟動代碼中,但我需要一個我的DbContext實例才能做到這一點,目前還不清楚如何獲得一個。我正在配置EF如下:

serviceCollection.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<Models.MyContext>(options => options.UseSqlServer(...));

我沒有看到從服務集合中獲取DbContext實例的方法,我沒有看到任何適當的單例來注入DbContext,所以我可以進行一次性初始化。

那麼確保一些與我的DbContext相關的代碼在每個應用程序運行時被調用一次的最佳位置是什麼?

熱門答案

我想知道為什麼你會跑去運行EnsureCreated作為你服務的一部分。您真的希望您的Web服務器創建或更新數據庫架構嗎?如果數據庫不是最新的,為什麼網絡服務器會啟動並提供請求?

您是否真的非常信任您的遷移,以至於它們在執行時不會破壞數據,您不希望在運行數據後對其進行測試?

此外,這將要求您為webserver數據庫用戶授予更改數據庫架構的權限。這本身就是一個漏洞 - 接管您的網絡服務器的人將能夠修改您的數據庫架構。

我建議您創建數據庫並在您自己運行的小實用程序中應用遷移,而不是作為Web應用程序的一部分。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因