我正在开发窗口应用程序,其中每个版本(更新视图,添加/删除列)之间的DB架构可以不同。因此,我正在寻找在应用程序启动客户端机器时让EF更新架构的方法。我读了一些文章但他们指的是包管理器命令Add-Migration, Update-Database
,在我的情况下我无法使用它。
当我尝试Database.SetInitializer<C>(new MigrateDatabaseToLatestVersion<C, Configuration<C>>());
时,我使用了存储库模式
我得到无法更新数据库以匹配当前模型,因为存在挂起的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。 exception
但是当我设置AutomaticMigrationsEnabled = true;
时,我又遇到了另一个错误:表&#39; TableName&#39;已存在。
答案 0 :(得分:0)
我找到了一种解决方法,创建了一个扩展方法
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);