如何在使用Entity Framework 4.1创建的生产中的现有数据库上使用迁移?

Jos*_*off 12 entity-framework ef-migrations

我有一个使用Entity Framework 4.1 Code First创建的生产系统.现在,我已升级到4.3并需要应用迁移,但我需要涵盖几个用例:

  1. 新开发人员需要使用种子数据从头开始创建数据库.(该Seed()方法还应用了一些独特的索引.)
  2. 生产环境仅需要应用未应用的更改.(但请记住,此DB是在EF 4.1中创建的,它没有迁移.)

如何创建迁移和初始化程序(或初始化程序)以涵盖这两种情况?

bri*_*lam 28

由于您的生产数据库是使用EF 4.1创建的,因此您需要做一些工作才能准备好与迁移一起使用.从dev environemnt中运行的当前生产代码的副本开始.确保dev数据库不存在.

  1. 升级项目以将EF 4.3(或更高版本)与迁移一起使用,并创建初始迁移到快照目前生产的生产.

    Update-Package EntityFramework
    Enable-Migrations
    Add-Migration InitialCreate  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用匹配的迁移代码替换数据库初始化程序.

    对于种子数据,将其添加到文件的Seed()方法中Migrations\Configuration.cs.请注意,与Seed()初始化程序中的方法不同,此方法每次Update-Database调用时都会运行.它可能需要更新行(重置种子数据)而不是插入它们.该AddOrUpdate()方法可以帮助解决这个问题.

    由于现在可以使用迁移创建唯一的indecies,因此应将它们添加到Up()InitialCreate迁移的方法中.您可以CreateTable()使用该Index()方法将它们与调用链接起来,也可以通过调用该CreateIndex()方法.

    您可以立即使用MigrateDatabaseToLatestVersion初始化程序在初始化期间运行迁移.

  3. 获取脚本以引导生产环境.

    Update-Database -Script
    
    Run Code Online (Sandbox Code Playgroud)

    从生成的脚本中,您将要删除几乎所有内容,因为表格存在.您需要的部分是CREATE TABLE [__MigrationHistory]INSERT INTO [__MigrationHistory]声明.

  4. (可选)删除EdmMetadata表,因为不再需要它.

一旦你做了这些事情,你就应该选择迁移.新开发人员可以Update-Database从头开始运行以创建数据库,您可以Update-Database针对生产运行(或使用迁移初始化程序)以在其中应用其他迁移.

  • 如果它为空,那么当你运行`Add-Migration`时数据库已经存在.要正确使用它,请将其指向不存在的数据库.例如`Add-Migration InitialCreate -ConnectionString'Data Source =.\ SQLEXPRESS; Initial Catalog = DummyDatabase; Integrated Security = True'-ConnectionProviderName System.Data.SqlClient` (3认同)