如何在Entity Framework中使用unsigned int / long类型?

时间:2014-10-10 16:07:44

标签: mysql entity-framework entity-framework-6

添加新迁移(代码优先)时,long数据类型的类属性已正确映射,但mysql的EF提供程序会跳过ulong数据类型。如何映射属性以使用mysql' s unsigned bigint

2 个答案:

答案 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 类型