gpt4 book ai didi

c# - 如何强制触发 OnModelCreating 每个 DataContext 初始化

转载 作者:行者123 更新时间:2023-11-30 21:38:21 28 4
gpt4 key购买 nike

我想每隔 new DataContext(new Entity()) 触发 OnModelCreating ...但是当我创建一个表的连接时,它起作用了。当为另一个表创建连接时,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 是正确的,OnModelCreating 只触发一次,因为 modelBuilder 被缓存了。有几种情况需要再次执行OnModelCreating。例如,当跨 session 实现 Multi-Tenancy 时,可能需要再次触发 OnModelCreating。

第一次创建 modelBuilder 时,EF 会缓存它以提高性能。它使用 IDbModelCacheKeyProvider.CacheKey 进行缓存。 OnModelCreating 在找不到与 CacheKey 关联的 Cache 时触发。因此,要再次触发 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 会降低性能。

关于c# - 如何强制触发 OnModelCreating 每个 DataContext 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46035249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com