EF Core 迁移:存在时删除唯一约束

EF Core Migrations: Drop Unique Constraint when it exists

上下文

我在 SQL 服务器中有一个 table,它在 table 的四列上有一个唯一索引。

当使用来自 EF Core 迁移的 migrationBuilder.AlterColumn 时,它首先尝试编写无法在 UNIQUE INDEX 上执行的 DROP INDEX 脚本。为了解决这个问题,我可以使用 migrationBuilder.DropUniqueConstraint,只要该约束存在,它就可以工作。

问题

有些开发者本地没有数据库,会运行从头开始所有的迁移脚本。这意味着将创建 UNIQUE INDEX,但没有数据,因此不会有 UNIQUE CONSTRAINT。在这种情况下,会抛出 SQL 异常,因为约束不存在。

我尝试使用 migrationBuilder.Sql 并执行 IF EXISTS 语句,检查约束是否存在,然后删除它。但是,它似乎没有正确执行,或者根本没有执行。

问题?

我的说法有问题吗,或者有更简单的方法来解决这个问题吗?

声明

migrationBuilder.Sql(@"
            IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME='CONSTRAINT_NAME')
            BEGIN
                ALTER COLUMN COLUMN_NAME DROP CONSTRAINT CONSTRAINT_NAME
            END");

根据评论,我们确定了问题所在。

我们最初采用 EF Core 数据库优先方法,其中使用 SSMS 编写 UNIQUE CONSTRAINT 脚本,进而创建 UNIQUE INDEX.

后来我们使用带有迁移的脚手架来进行InitialCreate迁移,首先移动到代码。在此步骤中,它生成了 modelBuilder 代码来创建 UNIQUE INDEX,但不是约束。这意味着我们的迁移脚本不再与最初是数据库优先的现有数据库的状态同步。

解决方案是停止尝试在迁移脚本中删除约束(我们甚至不需要),并将其从我们现有的数据库中删除。