使用实体框架代码优先迁移在应用程序启动时更新数据库架构

时间:2017-04-24 14:17:58

标签: entity-framework migration database-schema code-first

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

1 个答案:

答案 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);