我有一个使用 Entity Framework 4.1 Code First 创建的生产系统。现在,我已经升级到 4.3 并且需要应用迁移,但是我需要涵盖几个用例:
- 新开发人员需要使用种子数据从头开始创建的数据库。(该
Seed()
方法还应用了一些唯一索引。) - 生产环境只需要应用未应用的更改。(但请记住,此数据库是在 EF 4.1 中创建的,它没有迁移。)
如何创建迁移和初始化程序(或初始化程序)以涵盖这两种情况?
我有一个使用 Entity Framework 4.1 Code First 创建的生产系统。现在,我已经升级到 4.3 并且需要应用迁移,但是我需要涵盖几个用例:
Seed()
方法还应用了一些唯一索引。)如何创建迁移和初始化程序(或初始化程序)以涵盖这两种情况?
由于您的生产数据库是使用 EF 4.1 创建的,因此您需要做一些工作以使其准备好与Migrations一起使用。从在开发环境中运行的当前生产代码的副本开始。确保 dev 数据库不存在。
升级项目以使用带有迁移的 EF 4.3(或更高版本)并创建初始迁移以快照生产当前的样子。
Update-Package EntityFramework
Enable-Migrations
Add-Migration InitialCreate
用匹配的迁移代码替换您的数据库初始化程序。
对于种子数据,将其添加到文件的Seed()
方法中Migrations\Configuration.cs
。请注意,与Seed()
初始化程序中的方法不同,此方法每次Update-Database
调用时都会运行。它可能需要更新行(重置种子数据)而不是插入它们。该AddOrUpdate()
方法可以对此有所帮助。
由于您现在可以使用 Migrations 创建独特的缺陷,因此您应该将它们添加到Up()
InitialCreate 迁移的方法中。您可以CreateTable()
使用该Index()
方法或通过调用该CreateIndex()
方法将它们链接到调用中。
您现在可以使用MigrateDatabaseToLatestVersion初始化程序在初始化期间运行迁移。
获取一个脚本来引导您的生产环境。
Update-Database -Script
从生成的脚本中,您将想要删除几乎所有内容,因为这些表已经存在。您需要的部分是CREATE TABLE [__MigrationHistory]
andINSERT INTO [__MigrationHistory]
语句。
(可选)删除该EdmMetadata
表,因为它不再需要。
Once you do these things, you should be good to go with Migrations. New developers can run Update-Database
to create the database from scratch, and you can run Update-Database
(or use the Migrations initializer) against production to apply additional migrations there.