【发布时间】:2014-12-05 20:55:26
【问题描述】:
long 数据类型的类属性在添加新迁移(代码优先)时正确映射,但 mysql 的 EF 提供程序会跳过 ulong 数据类型。如何映射一个属性来使用mysql的unsigned bigint?
【问题讨论】:
标签: mysql entity-framework entity-framework-6
long 数据类型的类属性在添加新迁移(代码优先)时正确映射,但 mysql 的 EF 提供程序会跳过 ulong 数据类型。如何映射一个属性来使用mysql的unsigned bigint?
【问题讨论】:
标签: mysql entity-framework entity-framework-6
2021 年 2 月更新
显然 EF Core 现在支持 ulong -- 请参阅下面的 @JimbobTheSailor 的回答。
旧实体框架版本:
原来实体框架不支持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 以防止溢出异常。
希望这对某人有所帮助。
【讨论】:
ulong 的身份工作。您只需将它们存储为long。它们在 long 版本中没有意义,但这没关系,因为它们总是会转换回它们曾经的精确 ulong 值,这意味着你只需要在你想使用时将它们转换回来他们。但是,您不能进行数据库内计算,因为它们将使用“坏”长值。
2021 年 2 月更新 Entity Framework Core
EF Core 3.1: EF Core 现在支持 long 和 ulong 类型。首先使用代码,将 long 或 ulong 映射到 EF Core 的新“十进制类型”
public ulong MyULong{ get; set; } //==> decimal(20, 0)
一个ulong导致在数据库中定义一个小数点,小数点右边有20位和0位,足以存储一个64位的ulong。
EF 5: 感谢@Tomasz 注意到在 EF 5 和 6 中,ulong 映射到 BigInt,而不是根据我原来的答案的 Decimal 类型,现在在上面的“EF Core 3.1”标题下
【讨论】:
public ulong Test { get; set; } 生成 Test = table.Column<long>(type: "bigint", nullable: false),