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

标签 c# .net entity-framework-5 entity-framework-migrations ef-database-first

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

这些似乎都适用于 EF5 之前的 EF 版本,而我的情况似乎不符合这些答案。那么,让我描述一下我的情况。

  1. 我的应用程序最初是使用 EF4 创建的,模型优先。我使用 GUI 设计器设计了我的数据库,并使用它来生成我的数据库。
  2. 几个月来我一直在运行并将数据收集到数据库中。我真的不能丢失这些数据。
  3. 我对我的代码进行了分支,使用 NuGet 安装了 EF5,并使用 EF Power Tools 通过右键单击一个新的类库项目并选择 Entity Framework | 从我的数据库生成模型。首先对代码进行逆向工程
  4. 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的 DbContext 而不是 ObjectContext,并删除了包含我的旧模型的 EF4 类库。该程序运行良好!

现在,我想尝试自动迁移,我在 Ruby on Rails 中已经有了一点经验。这是我所做的:

  1. 运行 Enable-Migrations。由于连接字符串和正在使用哪个 app.config 而遇到了一些麻烦,但最终还是解决了。然而,this MSDN page说这应该会自动生成第一次迁移,让我到达我已经到达的地步。它没有。
  2. 运行 Add-Migration InitialSchema 以完成第 1 步中未自动完成的操作。这行得通。
  3. 向我的模型对象之一添加了一个属性,然后尝试运行 Add-Migration AddSerialToLogEntries,并显示:

Unable to generate an explicit migration because the following explicit migrations are pending: [201307190100268_InitialSchema]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

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

我上面提到的其他答案基本上是说我运气不好,但就像我说的那样,这些答案是针对较旧版本的 Entity Framework 的。我在这里有什么选择吗?

在写这个问题时,我想我也许可以使用 SQL Server Management Studio 将我的数据导出到 SQL 脚本,删除整个数据库,让 EF 创建它,然后运行脚本来取回我的数据。 .. 明天有时间我会试试看,但我想听听是否还有其他选择,因为我不是 100% 确定这会起作用,并且不希望在过程中插入的数据有任何错误。

最佳答案

Ran Enable-Migrations. Had a bit of trouble due to connection strings and which app.config was getting used, but eventually got it. However, this MSDN page says that this should have automatically generated the first migration to get me to the point I'm already at. It didn't.

Ran Add-Migration InitialSchema to accomplish what wasn't automatically done in step 1. This worked.

事实上enable-migrations仅当您的数据库之前已使用 Code-First 创建时,命令才会创建初始迁移,在这种情况下,数据库包含 __MigrationHistory table 。如果此表不存在(当您有一个以前从未使用代码优先创建的现有数据库时就是这种情况)enable-migrations只创建 Configuration类(class)。你必须调用add-migration然后手动创建第一个迁移类。因此,您所看到的行为是意料之中的。

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

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

  • 打开Configuration类和集合 AutomaticMigrationsEnabled = false在构造函数中(如果默认情况下还没有)。

  • 在包管理器控制台调用

    add-migration -IgnoreChanges InitialSchema
    

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

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

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

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

关于c# - 无法使用现有数据库运行 EF5 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736708/

相关文章:

c# - 缩略图视频 C#

c# - 如何使用 JsonProperty 获取嵌套属性

.net - DateTime.UtcNow.Ticks 有时会跳跃很多

c# - 在 C# 中无限/定期执行代码的最佳实践

entity-framework - Entity Framework 5 的新迁移功能是否完全支持枚举更改?

c# - Entity Framework 5 从 4 升级

c# - .net 中是否有任何免费的 LPR(车牌识别器)软件?

c# - 序列化 ArrayList 的 Arraylist

c# - 具有 protected setter 的最小起订量属性

c# - 类型 'System.Int16' 的表达式不能用于返回类型 'System.Object'