簡體   English   中英

如何強制啟動OnModelCreating每個初始化的DataContext

[英]How to force fire OnModelCreating every DataContext initialized up

我想觸發OnModelCreating每個new DataContext(new Entity()) ...但是,當我創建表的連接時,它就可以工作。 當為另一個表創建連接時,OnModelCreating不再起作用,因此,由於出現錯誤,

the entity type <tableName> is not part of the model for the current context.

public class DataContext : DbContext
{
    private BaseEntity _entity;

    public DataContext(BaseEntity entity)
    {
        Database.Connection.ConnectionString = Parameters.ConnectionString;

        _entity = entity;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        _entity.Map(modelBuilder); // this is dynamic fluent api here
    }
}

ta.speot.is正確,因為ModelBuilder被緩存,OnModelCreating僅觸發一次。 有幾種情況需要再次執行OnModelCreating。 例如,當跨會話實施多租戶時,可能需要再次觸發OnModelCreating。

首次創建modelBuilder時,EF會將其緩存以提高性能。 使用IDbModelCacheKeyProvider.CacheKey對其進行緩存。 當找不到與CacheKey關聯的Cache時,將觸發OnModelCreating。 因此,要再次觸發OnModelCreating,必須更改IDbModelCacheKeyProvider.CacheKey。

若要更改緩存鍵,DbContext類必須實現IDbModelCacheKeyProvider。 當返回新的緩存鍵時,在IDbModelCacheKeyProvider的CacheKey屬性中,則再次觸發OnModelCreating事件。

例如,請參見以下代碼塊:

public class TenantContext : DbContext, IDbModelCacheKeyProvider
{
    string IDbModelCacheKeyProvider.CacheKey {
        get { return tenentID.ToString(); }
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

當tenantID更改時,它會強制執行OnModelCreating,因為新的tenantID可能無法使用緩存。

注意:僅在非常緊急時才應更改CacheKey。 頻繁更改CacheKey將降低性能。

該手冊已為您服務!

DbContext.OnModelCreating方法(DbModelBuilder)

...

備注

通常,僅在創建派生上下文的第一個實例時才調用此方法一次。 然后將緩存該上下文的模型,並將其用於應用程序域中上下文的所有其他實例。 可以通過在給定的ModelBuidler上設置ModelCaching屬性來禁用此緩存,但是請注意,這會嚴重降低性能。 通過直接使用DbModelBuilder和DbContextFactory類,可以提供對緩存的更多控制。

盡管可能的話,您可能想探索一個通用的DbContext例如public class DataContext<TBaseEntity> : DbContext 這將導致您建立一個體系結構,其中每個TBaseEntity類型都有一個DataContext類型。

暫無
暫無

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

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