给定连接字符串,我正在尝试编写一种方法来创建数据库并在其上运行迁移。
我需要多个连接,因为我在单独的数据库中记录了审计日志。我使用类似的代码从 app.config 中获取连接字符串
ConfigurationManager.ConnectionStrings["Master"].ConnectionString;
该代码适用于我的 app.config 中定义的第一个连接字符串,但不适用于其他代码,这让我认为它以某种我不知道的方式从 app.config 获取连接字符串。
如果数据库不存在,我创建数据库的代码是
private static Context MyCreateContext(string ConnectionString)
{
// put the connection string where the factory method can get it
AppDomain.CurrentDomain.SetData("ConnectionString", ConnectionString );
var factory = new ContextFactory();
// I know I need this line - but I cant see how what follows actually uses it
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context,DataLayer.Migrations.Configuration>());
var context = factory.Create();
context.Database.CreateIfNotExists();
return context
}
Migrations.Configuration 中的代码是
Public sealed class Configuration : DbMigrationsConfiguration<DataLayer.Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
}
上下文工厂代码是
public class ContextFactory : IDbContextFactory<Context>
{
public Context Create()
{
var s = (string)AppDomain.CurrentDomain.GetData("ConnectionString");
return new Context(s);
}
}
因此,我在创建上下文之前设置了连接字符串。
考虑到除了数据库名称之外的连接字符串都相同,并且迁移代码使用一个连接字符串运行,但不使用其他连接字符串运行,我哪里会出错?
我想知道我的问题是否与了解 Database.SetInitializer 如何实际工作有关。我在猜测关于反射或泛型的一些事情。我如何使对 SetInitializer 的调用与我的实际上下文相关联?
我尝试了以下代码,但迁移不运行
private static Context MyCreateContext(string ConnectionString)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, DataLayer.Migrations.Configuration>());
var context = new Context(ConnectionString);
context.Database.CreateIfNotExists();
}
更新:
如果我使用 public MyContext() 引用连接字符串,我可以使迁移工作: base("MyContextConnection") - 指向配置
如果我创建了一个 ContextFactory 类并通过引用全局将连接传递给它,我还能够使用上下文的不同实例进行迁移。(请参阅我对相关问题链接的回答)
现在我想知道为什么它必须这么难。