【问题标题】:Entitiy Framework code-first migrations in multiple development environments多个开发环境中的实体框架代码优先迁移
【发布时间】:2015-06-08 11:24:57
【问题描述】:

我正在开发一个使用 EF6代码优先迁移 的项目。 到目前为止,所有工作都是在 Dev 上完成的。环境,包括数据库迁移。

我需要将代码部署到另一个环境 (QA),但是我偶然发现了一个问题:
数据库存在,但是没有表(我手动创建了数据库)。

目前,QA 中的代码会抛出 Invalid object name 'dbo.__MigrationHistory'. 并且确实该表在 QA 中不存在,它仅存在于首次启用迁移的 DEV 中。

在多个开发环境中使用迁移的最佳做法是什么 (DEV => QA => STG => PROD)? 我最好的做法是什么?

更新
我已经手动创建了dbo.__MigrationHistory 和架构,并从 DEV 表中填充了迁移表。这个问题仍然存在,因为我必须在本月晚些时候部署到 STG 和 PROD。

【问题讨论】:

    标签: sql-server entity-framework-6 entity-framework-migrations


    【解决方案1】:

    如果您使用某种持续集成,您可以按照以下方式进行:

    1. 在您的迁移项目中创建将转换的构建配置 连接字符串以适应构建时的环境要求(使用 XDT),
    2. 使用 MSBuild 使用相应的配置参数构建项目,
    3. 使用 migrate.exe(例如,来自 EF Nuget 包的文件夹)使用构建的 DLL 运行迁移。

    如果您不执行 CI,那么您只需按照第一步,始终使用使用相应构建配置构建的迁移项目进行部署。 注意:手动弄乱 __MigrationHistory 表绝不是好的做法。

    要创建数据库,您可以使用CreateDatabaseIfNotExists 初始化程序。

    【讨论】:

    • 迁移项目就像在 DAL 项目中一样,或者您如何为迁移创建一个单独的项目?
    • 其实我写的步骤没关系。我们有一个单独的 dll 来保存所有实体,EntityTypeConfigurationsDbMigrationConfigurationsDbMigrations,仅此而已。
    • DbMigrations 不应该与实体在同一个项目中吗?我也有一个单独的项目(nuget)中的所有实体,但是我的 DbMigrations 和 DbContext 在我的主要解决方案中的 dal 项目中。但是,我会探讨你的提议,因为这对我来说很有意义。尽管关于部署到没有 __MigrationHistory 的完全干净的环境,我仍然没有明确的答案
    • 我确实将它们放在一个 dll 中。正如我所写。
    【解决方案2】:

    您可以尝试以下几个选项:

    1- 使用数据库初始化器:

    Database.SetInitializer<UserDbContext>(new MigrateDatabaseToLatestVersion<UserDbContext, Configuration>());
    

    2- 使用 ssdt 在环境(qa、dev、prod 等)之间迁移表和数据

    【讨论】:

    • 1 不起作用,因为新数据库还没有 __MigrationHistory 表。 2是我做的,但是我希望有更好的方法,复制架构并复制迁移表数据感觉很hacky
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多