添加新迁移(代码优先)时,long
数据类型的类属性已正确映射,但mysql的EF提供程序会跳过ulong
数据类型。如何映射属性以使用mysql' s unsigned bigint
?
答案 0 :(得分:41)
原来,Entity Framework不支持unsigned
数据类型。对于uint
列,可以将值存储在具有更大范围的签名数据类型中(即long
)。那么ulong
列怎么样?常见的解决方案对我来说不起作用,因为没有EF支持的签名数据类型可以容纳ulong
而不会溢出。
经过一番思考后,我找到了解决此问题的简单方法:只需将数据存储在支持的long
类型中,然后在访问时将其转换为ulong
。你可能会想:“但等等,ulong的最大值> long的最大值!”您仍然可以将ulong的字节存储在long中,然后在需要时将其强制转换为ulong,因为它们都有8个字节。这将允许您通过EF将ulong变量保存到数据库。
// Avoid modifying the following directly.
// Used as a database column only.
public long __MyVariable { get; set; }
// Access/modify this variable instead.
// Tell EF not to map this field to a Db table
[NotMapped]
public ulong MyVariable
{
get
{
unchecked
{
return (ulong)__MyVariable;
}
}
set
{
unchecked
{
__MyVariable = (long)value;
}
}
}
转换为unchecked
以防止溢出异常。
希望这有助于某人。
答案 1 :(得分:2)
2021 年 2 月更新实体框架核心
EF Core 3.1: EF Core 现在支持 long 和 ulong 类型。首先使用代码,long 或 ulong 映射到 EF Core 的新“十进制类型”
public ulong MyULong{ get; set; } //==> decimal(20, 0)
a ulong 导致在数据库中定义了一个小数点,小数点右边有 20 位和 0 位,足以存储一个 64 位的 ulong。
EF 5: 感谢@Tomasz 注意到在 EF 5 和 6 中,ulong 被映射到 BigInt,而不是根据我原来的答案,现在在上面的标题“EF Core 3.1”下的 Decimal 类型