2017-04-24 100 views
0

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

+0

请参阅[这里](http://stackoverflow.com/questions/35144784/how-to-use-migration-programmatically-in-entityframework-codefirst)和[这里](https://romiller.com/2012/02/09/running-scripting-migrations-from-code /) –

+0

我已阅读并尝试以上但未成功,我更新了我的问题以获取更多详细信息@SteveGreene –

+0

听起来像您没有正确配置迁移。您需要进行初始基线迁移“添加迁移MyBaseline -IgnoreChanges”。然后,为随后的更改正常添加迁移。 –

回答

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); 
     } 
    } 

然后创建类MyMigration它继承DbMigration像正常迁移,而当应用程序启动,我会检查,并迫使它象下面这样运行:

var myMigration = new MyMigration(); 
myMigration.Up(); 
this.RunMigration(myMigration); 
相关问题