无法使用现有数据库运行EF5迁移

Ste*_*eve 8 .net c# ef-database-first ef-migrations entity-framework-5

首先,我已经阅读了这些问题/答案:

这些似乎都适用于EF5之前的EF版本,我的情况似乎不适合这些答案.所以,让我描述一下我的情况.

  1. 我的应用程序最初是使用EF4创建的,模型优先.我使用GUI设计器设计了我的数据库,并用它来生成我的数据库.
  2. 我已经运行并将数据收集到数据库中几个月了.我真的不能丢失这些数据.
  3. 我分支我的代码,用NuGet安装EF5,并使用EF Power Tools通过右键单击新的类库项目并选择来从我的数据库生成我的模型Entity Framework | Reverse engineer code first.
  4. 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的DbContext而不是ObjectContext,并删除了保存旧模型的EF4类库.该计划效果很好!

现在,我想尝试自动迁移,我在Ruby on Rails中有一些经验.这是我做的:

  1. Enable-Migrations.由于连接字符串和app.config被使用而有点麻烦,但最终得到了它.但是,这个MSDN页面说这应该自动生成第一次迁移,以使我达到我已经到达的程度.它没有.
  2. 跑来Add-Migration InitialSchema完成第1步中没有自动完成的工作.
  3. 向我的某个模型对象添加了一个属性,然后尝试运行Add-Migration AddSerialToLogEntries,并显示:

无法生成显式迁移,因为以下显式迁移尚未处理:[201307190100268_InitialSchema].在尝试生成新的显式迁移之前应用挂起的显式迁移.

尝试在我现有的数据库上应用迁移失败,这并不奇怪.

我上面提到的其他答案基本上说我运气不好,但就像我说的那些是旧版本的实体框架.我有什么选择吗?

在写这个问题时,我想我可以使用SQL Server Management Studio将我的数据导出到SQL脚本,删除整个数据库,让EF创建它,然后运行脚本来重新获取我的数据......我会在明天有空的时候尝试,但我想听听是否还有其他选择,因为我不是100%肯定会工作,并且不愿意在流程中插入的数据中出现任何错误.

Sla*_*uma 12

Ran Enable-Migrations.由于连接字符串和app.config被使用而有点麻烦,但最终得到了它.但是,这个MSDN页面说这应该自动生成第一次迁移,以使我达到我已经到达的程度.它没有.

Ran Add-Migration InitialSchema来完成在步骤1中未自动完成的操作.这有效.

实际上,enable-migrations只有在已使用Code-First创建数据库之前,该命令才会创建初始迁移,在此情况下数据库包含__MigrationHistory表.如果此表不存在(当您拥有以前从未使用Code-First创建的现有数据库时),enable-migrations则只创建Configuration该类.您必须add-migration手动调用然后才能创建第一个迁移类.所以,你所看到的行为是预料之中的.

通常,如果您使用的是EF 5,则为迁移准备现有数据库的过程如下:

  • enable-migrations在包管理器控制台中调用.将创建Migrations项目中的文件夹和Configuration类.

  • 打开Configuration类并AutomaticMigrationsEnabled = false在构造函数中设置(如果默认情况下尚未设置).

  • 在包管理器控制台调用中

    add-migration -IgnoreChanges InitialSchema
    
    Run Code Online (Sandbox Code Playgroud)

    "InitialSchema"只是一个示例名称.您可以按照自己的意愿命名.一<Timestamp>_InitialSchema类将被创建,从派生DbMigration.由于标志,此类中的UpDown方法为空-IgnoreChanges.如果没有此标志,则类将包含迁移以将整个模型添加到数据库,这不是您想要的,因为现有数据库已包含数据库模式.

  • update-database在包管理器控制台中运行.因为该Up方法为空,所以此更新不会对现有模式执行任何操作,除非它创建__MigrationHistory表(作为数据库中的系统表)并将第一条记录添加到此表中,其中包含当前EF模型的模型哈希.

  • 可选的最后一步:如果您更喜欢使用自动迁移,请打开Configuration该类并AutomaticMigrationsEnabled = true在构造函数中进行设置.如果要继续进行基于代码的迁移,请留下标记false.

此时,您可以开始对模型进行更改.每次使用add-migration它创建新迁移时,都将基于修改前的模型,迁移类将仅包含必要的模式更改.