我正在开发窗口应用程序,其中数据库模式在每个版本之间可能不同(更新视图,添加/删除列)。因此,我正在寻找让EF在客户端计算机中启动应用程序时更新架构的方法。我读了一些文章,但他们指向包管理器命令Add-Migration, Update-Database
我不能在我的情况下使用。 我使用了存储库模式,所以当我尝试Database.SetInitializer<C>(new MigrateDatabaseToLatestVersion<C, Configuration<C>>());
我无法更新数据库以匹配当前模型,因为存在挂起的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。例外 但是当我设置AutomaticMigrationsEnabled = true;
时,我遇到了另一个错误:表"表名"已经存在。
我找到了解决方法,创建一个扩展方法
public static void RunMigration(this DbContext context, DbMigration migration)
{
var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance);
if (prop != null)
{
IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>;
var generator = new SqlServerMigrationSqlGenerator();
var statements = generator.Generate(operations, "2008");
foreach (MigrationStatement item in statements)
context.Database.ExecuteSqlCommand(item.Sql);
}
}
然后创建像普通迁移一样继承 DbMigration 的类MyMigration
,当应用程序启动时,我将检查并强制它运行如下:
var myMigration = new MyMigration();
myMigration.Up();
this.RunMigration(myMigration);