我正在尝试编写一个易于理解的DBContext
类,它采用自定义连接字符串,可以运行迁移,并且允许我使用包管理器生成迁移。
我好像在兜圈子。
我已经能够使用对我来说感觉很糟糕的代码让它工作。我在对连接字符串和迁移的这个问题的回答中记录了这一点。
Radek 的答案看起来比我的要好得多,但我发现当我实现它然后尝试在包管理器中创建迁移时,我收到了消息
目标上下文“DataLayer.Context”不可构造。添加默认构造函数或提供 IDbContextFactory 的实现。
DataLayer.Context
我的上下文课程在哪里。
我不想提供IDbContextFactory
(并且 Radek 的回答似乎表明它不需要)的实现
更新:
如果我包含不带参数的构造函数,我可以生成迁移。例如
public Context() : base("ConnectionStringName") { }
对于我的上下文创建,我在 app.config 中传递了连接字符串的名称
public Context(string connString) : base(connString)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}
最后,我既可以生成迁移,也可以为用户选择的数据库运行迁移。
但是:当我删除数据库然后运行我的应用程序时,我遇到了问题。
我正在使用的初始化代码,来自上面的链接是
public class CustomInitializer : IDatabaseInitializer<Context>
{
public void InitializeDatabase(Context context)
{
try
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
if (!context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase =
new DbConnectionInfo(context.Database.Connection.ConnectionString);
IEnumerable<string> migrations = migrator.GetPendingMigrations();
foreach (string migration in migrations)
{
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(null, migration);
context.Database.ExecuteSqlCommand(script);
}
}
}
}
catch (Exception ex)
{
}
}
}
当我删除数据库时,会创建一个新数据库,但它没有表。那是因为我的表创建代码都在我的第一次迁移中。
所以条件里面的代码!context.Database.CompatibleWithModel(false)
不会运行。
然而,遗憾的是,当它应该有元数据模型时,代码也没有第二次运行。
现在尝试让迁移运行...
悲伤:到目前为止,Radek 的自定义初始化程序没有。
根据 NSGaga 的评论,如果我更改连接,我会退出应用程序。
var master = new myMDIForm();
master.ConnectionType = connectionType; // being an enum of the different connection names in app.config
while (master.ConnectionType != ConnectionType.None )
{
Application.Run(master);
}