现有两个相同结构的数据库,架构名称不同,第一个数据库为[cw1].[database1],第二个为[cw2].[database2],其中[cw1]、[cw2]为架构名称,[database1]、[database2]为数据库名称。在EF中EntityTypeConfiguration中,添加参数schemaName传递到 this.ToTable("表1", schemaName)
通过 Context context = new Context(conn, “cw1”, false);创建实例,执行查询等操作成功,接着调用 Context context2 = new Context(conn, “cw2”, false);
返回的查询中生成的SQL语句却都带这[cw1],而没有变成[cw2]
经跟踪,参数[cw2]已经传递到DbContext,似乎DbContext没有重新执行ModelCreate,而是直接使用了上次生成的Model
求教在第二次执行Context context2 = new Context(conn, “cw2”, false);时,重新创建模型,强制执行ModelCreate?
等了这么久没发现标准答案,经分析是由于Context的Cache造成的,标准解决方法为自定义CacheName:
1、为Context增加IDbModelCacheKeyProvider接口扩展;
2、实现IDbModelCacheKeyProvider的CacheKey
public string CacheKey
{
get { return this.SchemaName; }
}
3、初始化Context时为SchemaName赋唯一值
有具体代码吗? 我现在也遇到Entity Framework6要动态切换Schema问题,而OnModelCreating只执行一次,换了connString后Schema还是没变过来
dbContext.Dispose 以后重新创建上下文试试
context2 = new Context(conn, “cw2”, false); 这样用感觉怪怪的,似乎有点偏门。
我一般是使用
public class DBContext1 : DbContext{public DBContext1() : base(ConnectionString){}}
public class DBContext2 : DbContext{public DBContext2() : base(ConnectionString){}}
我也觉得这样做挺好的