2017-08-17 172 views
0

我想用现有的数据库迁移并创建一个新的,如果不存在。EF核心迁移

的EF核心单证说:

如果您创建的初始迁移时数据库中已存在,则生成数据库创建代码,但它并没有运行,因为数据库中的数据模型已经匹配。当你部署应用程序到另一个环境中,该数据库不存在,该代码将运行到创建数据库

From EFCore docs

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

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

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

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

如果我做错了,那么使用迁移与现有数据库和新数据库一起运行的策略是什么?

Dotnet Core版本:1.1。 EFCore版本:1.1.2。

在此先感谢。

回答

3

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

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

随后的迁移将应用于这两者,并且您需要创建一个新的数据库。

+0

是的,它做到了这一点,但如果使用context.Database.Migrate(),仍然不足以在生产环境中工作。 – user1203003

+0

是的,您可能可以使用'Database.EnsureCreated'做些事情,但这只会创建模式,而不会创建迁移历史记录,所以如果它返回true(仅限第一次),则退出应用程序并返回并点击迁移。根据您需要更新的数量,在PROD上运行脚本可能会更容易添加最初的内容。 –

相关问题