微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

首先删除带有种子数据EF核心代码的列

如何解决首先删除带有种子数据EF核心代码的列

我首先开发一个具有.Net核心,ef核心和代码的项目。该项目包含多个迁移,例如,我们有下一个迁移列表:

Migrations/
     Initial
     Second
     Third

在初始迁移中,包含新表,新列,关系...以及一些表的种子数据。

例如:

IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'initial') 
BEGIN
    CREATE TABLE [Master].Colors (
        [Id] int NOT NULL IDENTITY,[Name] nvarchar(255) NOT NULL,[HexadecimalValue] nvarchar(6)  NULL,CONSTRAINT [PK_Colors] PRIMARY KEY ([Id])
        )
END;

IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'initial')
BEGIN
        SET IDENTITY_INSERT [Master].Colors ON;
        INSERT INTO [Master].Colors ([Id],[Name],[HexadecimalValue])
    VALUES 
        (1,N'Red','fff12'),(2,N'blue',(3,N'yellow','fff12');
        SET IDENTITY_INSERT [Master].Colors OFF;
END;

但是在第三次迁移中,我需要删除例如[HexadecimalValue]列。迁移脚本已生成

IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'third')
begin
    ALTER TABLE [Master].Colors DROP COLUMN [HexadecimalValue];
END;

一切似乎都可以,如果您运行这些查询示例,则不会有任何问题。问题是您不止一次运行它。当我的发布管道一次又一次地部署新版本时,我的脚本会引发错误,因为没有“ [HexadecimalValue]”列,并且sql Server会检查是否所有对象都存在,即使不执行查询也是如此(注意if语句,是由于--idempotent属性而产生的。)

我知道的仅有的两种解决方案是:

  • 更新以前的迁移,删除该列的种子数据。 (更新自动生成代码:()
  • 更新我的构建,并使用-from -to ef核心属性(限制版本部署:()

还有其他想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。