8

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

这些似乎都适用于 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% 确定这会起作用,并且不愿意在过程中插入的数据中出现任何错误。

4

2 回答 2

12

运行启用迁移。由于连接字符串以及正在使用哪个 app.config 遇到了一些麻烦,但最终得到了它。但是,这个 MSDN 页面说这应该已经自动生成了第一个迁移,以使我达到我已经达到的目的。它没有。

运行 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
    

    “InitialSchema”只是一个示例名称。你可以随意命名。将<Timestamp>_InitialSchema创建一个派生自DbMigration. 由于该标志,此类中的 and 方法为空Up。如果没有此标志,该类将包含迁移以将整个模型添加到数据库,这不是您想要的,因为现有数据库已经包含数据库模式。Down-IgnoreChanges

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

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

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

于 2013-07-21T15:38:54.820 回答
3

我会建议一种稍微不同的方法,这将使您处于可以使用迁移在您的开发环境中从头开始创建数据库的状态:

  1. 与其调用 ,不如add-migration -IgnoreChanges InitialSchema尝试让初始模式迁移的生成工作。正如您所说,这应该在您最初调用 Enable-Migrations. 您可以尝试将您的数据库连接指向一个不存在的数据库以使其正常工作。

  2. 因此,您的InitialSchema迁移将包含创建数据库的逻辑,就像您对它进行逆向工程时一样。您需要注释掉 and 的内容, Up()直到Down()您部署到所有已经拥有现有数据库的环境。

  3. 然后您可以取消注释这些方法的内容,从那时起,在您的开发环境中,您可以删除数据库并使用重新创建它们

    var migrator = new DbMigrator(new Configuration());
    migrator.Update();
    

    并且您将在您的__MigrationHistory 表中拥有完整的迁移集。这很重要,因为没有它,您将来将无法添加新的迁移。

于 2013-11-05T16:39:16.937 回答