【发布时间】:2022-01-20 03:34:34
【问题描述】:
我有一个 EF Core Code-First 表,例如:
public class Entity
{
public byte ID { get; set; }
public string Name { get; set; }
...
}
还有许多其他表格:
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:无法更改列“ID”:用于表“Others”的外键约束“FK_Others_Entity_EntityID”
我只想添加AUTO_INCREMENT,这样外键应该是安全的。如何添加它,或者是否有办法让 EF Core 6 迁移仅在此迁移期间关闭外键检查?
【问题讨论】:
-
如何将字节设置为主键。字节存储的值有限,例如 1 和 0。为此使用 int 或 Varachar(limit)。
-
byte是mysql中的tinyint,取值范围是0到255,在某些情况下足够了,可以节省空间。 -
外键检查可以使用migrationBuilder的Sql函数。
migrationBuilder.Sql("ALTER TABLE Entity NOCHECK CONSTRAINT ALL") -
如果您担心节省空间,请在字符串上设置最大长度。我真的建议在您的模型上切换到数字数据类型。当前的解决方案虽然在技术上可行,但增加了不必要的难度和复杂性。
-
我实际上在字符串上设置了一个最大长度,只是在问题中发出,因为它不相关。
标签: c# mysql entity-framework-core ef-core-6.0