ASP.NET Core OnModelCreating強制在每個請求中觸發

asp.net-core-mvc c# entity-framework-core sql-server

ASP.NET Core OnModelCreating強制在每個請求中觸發

我有ASP.NET Core(1.1.0)和SQL Server數據庫。在登錄頁面中,我有一個表格,其中包含一個名稱為公司的選擇框。

例如:

  • 公司1
  • 公司2

如果用戶選擇第一個“公司1”,我需要使用公司前綴重命名所有表:

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

    foreach (var entity in builder.Model.GetEntityTypes())
    {
       entity.Relational().TableName = "Company 1" + entity.DisplayName();
    }
}

它運行得很好,但問題是當用戶選擇錯誤的公司,或退出系統並使用其他公司重新登錄時,OnModelCreating永遠不會再次調用,我無法重新配置dbContext。

是否有可能為每個請求強制OnModelCreating?

或者在dbContext啟動後更改表名?

謝謝!

熱門答案

這是錯誤的方式。當EF從您的類創建/描述模型時, OnModelCreating運行。這裡有很多反射和類型操作,包括驗證關係,與真實DB進行比較(並檢查是否需要遷移)等等。你真的需要在每個請求上運行所有這些東西???

不要為每個請求重新創建DbContext。創建幾個DbContexts並在請求開始時選擇其中一個(創建一次!)。

例如:

製作主DbContext摘要,並根據需要創建盡可能多的CompanyXDbContext。它們都應該從基類繼承,為它提供簡單的表前綴(在ctor中)。

代碼中的任何地方,當您需要DbContext時,從DI請求抽象/基類。

Startup ,使用工廠方法註冊抽象DbContext,根據當前Request變量/ params選擇真實的,或編寫基於當前Request創建正確實例的自定義中間件。


如果您有很多CompanyX,那麼您可能需要其他東西而不是許多預編碼的CompanyXDbContext類,運行時類創建或可能是泛型...但主要想法仍然沒有改變 - 不要一次又一次地重新創建模型每一個要求。



Related

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