EF Core 6 - 如何将 AUTO_INCREMENT 添加到其他外键使用的列

EF Core 6 - How to add AUTO_INCREMENT to a column used by other foreign keys

我有一个 EF Core Code-First table 比如:

public class Entity
{
    public byte ID { get; set; }
    public string Name { get; set; }
    ...
}

还有许多其他 tables:

public class Others 
{
    ...
    public byte EntityID { get; set; }
    ...
    [ForeignKey("EntityID")]
    public Entity Entity { get; set; }
}

我只知道如果您使用 byte 作为主键,EF Core 6 不会设置 AUTO_INCREMENT,所以我尝试添加它:

public class Entity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte ID { get; set; }

    public string Name { get; set; }
    ...
}

迁移cs是:

migrationBuilder.AlterColumn<byte>(
                name: "ID",
                table: "Entity",
                type: "tinyint unsigned",
                nullable: false,
                oldClrType: typeof(byte),
                oldType: "tinyint unsigned")
                .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn);

但是当我尝试迁移时,出现此错误:

MySqlConnector.MySqlException: Cannot change column 'ID': used in a foreign key constraint 'FK_Others_Entity_EntityID' of table 'Others'

我只想添加 AUTO_INCREMENT 所以外键应该是安全的。我该如何添加它,或者是否有办法让 EF Core 6 迁移仅在此迁移期间关闭外键检查?

作为@Kiran Joshi的评论我可以使用原始SQL来暂停外键检查并且MySQL版本是:

migrationBuilder.Sql("SET FOREIGN_KEY_CHECKS=0");

将此和 migrationBuilder.Sql("SET FOREIGN_KEY_CHECKS=1");(可能不需要)放入 UpDown 完成工作。

最好的办法可能是删除外键约束,修改列,然后重新添加外键约束。 in this answer.

详细介绍了此方法

这个列是table的主键吗?它允许空值吗?

我的建议是您考虑在 EF 迁移之外执行此更改,即使您更新迁移以在未来的干净数据库部署中实施更改也是如此。删除约束来操纵模式可能会产生意想不到的严重后果。备份是你的朋友。