C# 首先删除包含种子数据EF核心代码的列

C# 首先删除包含种子数据EF核心代码的列,c#,sql,asp.net-core,entity-framework-core,ef-code-first,C#,Sql,Asp.net Core,Entity Framework Core,Ef Code First,我正在开发一个具有.Net核心、ef核心和代码优先的项目。该项目包含多个迁移,例如,我们有下一个迁移列表: Migrations/ Initial Second Third 在初始迁移中包含新表、新列、关系。。。。以及一些表的种子数据 例如: IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'initial') BEGIN CREATE TABLE [M

我正在开发一个具有.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', 'fff12'),
        (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核心属性(限制版本部署:()

还有其他想法吗?

表应该跟踪数据库正在进行的迁移,并且只执行必要的迁移。您可以检查此表的内容,看看是否提到了最新的迁移吗?Thask Jay Fridge但是,
\u EFMigrationsHistory
表中的所有迁移都进行得非常顺利od。这不是我的问题。试着检查一下这两个脚本,尝试多次执行它们,你就会明白我的问题。这似乎是.NET Core中的一个问题。3.x中不会包含对此的修复,但在这个问题中提到了一些解决方法。谢谢你,Jay!!这正是发生在我身上的事情。