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");
(可能不需要)放入 Up
,Down
完成工作。
最好的办法可能是删除外键约束,修改列,然后重新添加外键约束。 in this answer.
详细介绍了此方法
这个列是table的主键吗?它允许空值吗?
我的建议是您考虑在 EF 迁移之外执行此更改,即使您更新迁移以在未来的干净数据库部署中实施更改也是如此。删除约束来操纵模式可能会产生意想不到的严重后果。备份是你的朋友。
我有一个 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");
(可能不需要)放入 Up
,Down
完成工作。
最好的办法可能是删除外键约束,修改列,然后重新添加外键约束。 in this answer.
详细介绍了此方法这个列是table的主键吗?它允许空值吗?
我的建议是您考虑在 EF 迁移之外执行此更改,即使您更新迁移以在未来的干净数据库部署中实施更改也是如此。删除约束来操纵模式可能会产生意想不到的严重后果。备份是你的朋友。