![](/img/trans.png)
[英]ASP.NET Core OnModelCreating force to fire in every request
[英]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.