我有一个DbContext,我想开始处理一系列具有相同属性的表。由于OnModelCreating只被触发一次,我需要手动编译模型并将其传递给构造函数,以使其尊重表名中的更改。
在我的建设路径中,我做了类似的事情:
var modelBuilder = new DbModelBuilder();
var cs = WebConfigurationManager.ConnectionStrings.Cast<ConnectionStringSettings>().FirstOrDefault(x => x.Name == "MyConnectionString");
using(var connection = new SqlConnection(cs.ConnectionString)) {
// This sets up the ToTable/HasKey/etc information
ConfigureSpecificModelInformation(modelBuilder);
var model = modelBuilder.Build(connection).Compile();
// DbContext with an IDbSet<T> Entities
Context = new MyDbContext(model);
// This will throw a SqlException (inside of an EntityException)
Context.Entities.ToList();
}
例外是:
System.Data.SqlClient.SqlException : Cannot open database "Namespace.Name.ForThisContext.MyDbContext" requested by the login
我传入的连接是有效的,并用于其他更传统的地方。该模型似乎使用连接来构建,但一旦进入上下文,它可能会使用一些独角兽魔法根据上下文名称推断出不正确的数据库。
我很难找到有关此信息的信息,因为MS已经取消了我们关闭模型缓存的能力,我需要解决这个问题。
答案 0 :(得分:1)
您应该使用this overload for a DbContext's ctor。这允许您传递您正在使用的连接。即:
var modelBuilder = new DbModelBuilder();
var cs = WebConfigurationManager.ConnectionStrings.Cast<ConnectionStringSettings>().FirstOrDefault(x => x.Name == "MyConnectionString");
using(var connection = new SqlConnection(cs.ConnectionString)) {
// This sets up the ToTable/HasKey/etc information
ConfigureSpecificModelInformation(modelBuilder);
var model = modelBuilder.Build(connection).Compile();
// DbContext with an IDbSet<T> Entities
Context = new MyDbContext(connection, model, false);
// This will throw a SqlException (inside of an EntityException)
Context.Entities.ToList();
}