c# - EF Core 数据库更新指定基本版本
问题描述
在我的项目中,我在基于初始版本和更新后创建的 Migrations 文件夹中有两个 EF 核心迁移文件。初始迁移(“Initial”)包含许多语句,而第二次迁移(“Cleanup”)在其方法中CreateTable
仅包含一些DropColumn
语句。Up
我的数据库是通过context.Database.EnsureCreated()
第一次和第二次迁移之间的调用创建的,即我现在想执行第二次迁移。但是,如果我打电话,dotnet ef database update Cleanup
我会收到一个错误:
Applying migration '20190409043916_Initial'.
Failed executing DbCommand (6ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [LongRunningOperations] (
[Id] bigint NOT NULL IDENTITY,
[Start] datetime2 NOT NULL,
[End] datetime2 NULL,
[Discriminator] nvarchar(max) NOT NULL,
CONSTRAINT [PK_LongRunningOperations] PRIMARY KEY ([Id])
);
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'LongRunningOperations' in the database.
显然,EF 也希望应用第一次迁移。是否有指定数据库基本版本的选项?我可以做些什么来避免执行“初始”迁移吗?
一个更普遍的问题可能有助于我理解正在发生的事情:EF Core 如何确定基本版本是什么,即必须执行哪些迁移?
解决方案
我的数据库是通过调用创建的
context.Database.EnsureCreated()
这就是问题的根源。创建和删除 API的文档包含以下内容:
警告
EnsureCreated 和 Migrations 不能很好地协同工作。如果您使用迁移,请不要使用 EnsureCreated 来初始化架构。
进而:
从 EnsureCreated 过渡到 Migrations 并不是一种无缝的体验。最简单的方法是删除数据库并使用迁移重新创建它。如果您预计将来会使用迁移,最好从迁移开始,而不是使用 EnsureCreated。
在运行时应用迁移中类似:
警告
EnsureCreated()
之前不要打电话Migrate()
。EnsureCreated()
绕过迁移来创建架构,这会导致Migrate()
失败。
很快,您应该已经使用过 EF Core 工具或context.Database.Migrate()
用于创建/更新数据库。
由于您以错误的方式执行此操作,请按照他们的建议“删除数据库并使用迁移重新创建它”,或者尝试按照 EF Core 最初创建并填充它的方式重建迁移历史记录表,如果您使用预期的迁移工作流程。
推荐阅读
- types - Ocaml 类型中的 Int 的 Int
- python - 如何使用 python 从 SQL Server 检索时间戳?
- javascript - Braintree/Javascript: How do I get access to previous customer's billing address?
- c# - 向用户显示建议并获得输入
- javascript - 桶排序 JavaScript
- javascript - 将这些常见的断言保存在单独的文件中而不重复它是一个好主意吗?
- node.js - JSONSerialization 生成不正确的 JSON 对象。迅速
- swift - 使用 CoreML 从模式预测结果
- ssh - 需要帮助“服务器发送断开连接消息类型 11(由应用程序)“用户身份验证超时””
- sql - 对于所有记录,查询求和来自同一个表的两条记录