首先,我阅读了这些问题/答案:
- EF-migration message
- How can I stop Add-Migration checking my database has no pending migrations when using Code-Based migrations?
- Make EF4.3 Code First Migrations ignore pending migrations
这些似乎都适用于 EF5 之前的 EF 版本,而我的情况似乎不符合这些答案。那么,让我描述一下我的情况。
- 我的应用程序最初是使用 EF4 创建的,模型优先。我使用 GUI 设计器设计了我的数据库,并使用它来生成我的数据库。
- 几个月来我一直在运行并将数据收集到数据库中。我真的不能丢失这些数据。
- 我对我的代码进行了分支,使用 NuGet 安装了 EF5,并使用 EF Power Tools 通过右键单击一个新的类库项目并选择
Entity Framework | 从我的数据库生成模型。首先对代码进行逆向工程
。 - 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的 DbContext 而不是 ObjectContext,并删除了包含我的旧模型的 EF4 类库。该程序运行良好!
现在,我想尝试自动迁移,我在 Ruby on Rails 中已经有了一点经验。这是我所做的:
- 运行
Enable-Migrations
。由于连接字符串和正在使用哪个 app.config 而遇到了一些麻烦,但最终还是解决了。然而,this MSDN page说这应该会自动生成第一次迁移,让我到达我已经到达的地步。它没有。 - 运行
Add-Migration InitialSchema
以完成第 1 步中未自动完成的操作。这行得通。 - 向我的模型对象之一添加了一个属性,然后尝试运行
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
的类.Up
和Down
由于-IgnoreChanges
,此类中的方法为空旗帜。如果没有此标志,该类将包含将整个模型添加到数据库的迁移,这不是您想要的,因为现有数据库已经包含数据库架构。运行
update-database
在包管理器控制台中。因为Up
方法为空此更新对您现有的模式没有任何作用除了它创建了__MigrationHistory
表(作为数据库中的系统表)并将第一条记录添加到此表,其中包含当前 EF 模型的模型哈希。可选的最后一步:如果您更喜欢使用自动迁移,请打开
Configuration
类和集合AutomaticMigrationsEnabled = true
在构造函数中。如果您想继续进行基于代码的迁移,请留下标志false
.
此时您可以开始更改您的模型。每次使用 add-migration
创建新迁移时它将基于修改前的模型,迁移类将仅包含必要的架构更改。
关于c# - 无法使用现有数据库运行 EF5 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17736708/