【问题标题】:EF Core MigrationsEF 核心迁移
【发布时间】:2017-08-18 02:42:07
【问题描述】:

我正在尝试对现有数据库使用迁移并创建一个新数据库(如果不存在)。

EF Core 文档说:

如果您在数据库已经存在时创建了初始迁移,则会生成数据库创建代码,但不必运行,因为数据库已经与数据模型匹配。当您将应用程序部署到数据库尚不存在的另一个环境时,此代码将运行以创建您的数据库

From EFCore docs

我进行了初始迁移,它创建了一个 up 和 down 方法来创建我的表。当我将它运行到一个新数据库(连接字符串中的新数据库名称)时,它会按预期创建数据库和表。

但如果我将它运行到现有数据库(不是由迁移创建的),它会在尝试创建已存在的表的第一个 up 方法时失败,并且迁移停止运行。

Docs 说“它不必运行”,但迁移做的第一件事就是尝试创建一个现有的表。

如何防止迁移以尝试创建现有表?迁移中内置了“如果不存在则创建”之类的东西?文件对吗?它应该按预期/文档中描述的方式工作?

如果我做错了,使用迁移以在现有数据库和新数据库上运行的策略是什么?

Dotnet 核心版本:1.1。 EFCore 版本:1.1.2。

提前致谢。

【问题讨论】:

    标签: .net-core entity-framework-core entity-framework-migrations


    【解决方案1】:

    您需要对现有数据库进行基线迁移。在 EF 6 中,您使用了 -IgnoreChanges 标志,但现在 Core 中不存在该标志。见here

    您可以在 EF Core 中通过注释掉所有 Up() 代码并应用该迁移来完成同样的事情。这将创建 __MigrationHistory 表并插入一条记录,表明它已被应用。

    后续迁移将同时应用于这两个数据库,如果您需要创建一个新数据库,则涵盖范围内。

    【讨论】:

    • 是的,它成功了,但如果使用 context.Database.Migrate(),仍然不足以在生产中工作。
    • 是的,您也许可以使用 Database.EnsureCreated 做一些事情,但这只会创建架构,而不是迁移历史记录,因此如果它返回 true(仅是第一次)退出应用程序并继续回到并点击迁移。可能更容易在 PROD 上运行脚本来添加初始内容,具体取决于您必须更新的数量。
    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2018-10-30
    • 2016-10-13
    相关资源
    最近更新 更多