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

ara*_*ao6 24 mysql entity-framework entity-framework-6

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

ara*_*ao6 42

事实证明,Entity Framework不支持unsigned数据类型.对于uint列,可以将值存储在具有较大范围的签名数据类型中(即a long).ulong列怎么样?常见的解决方案对我来说不起作用,因为没有EF支持的签名数据类型可以保持ulong不溢出.

经过一番思考后,我想出了一个解决这个问题的简单方法:只需将数据存储在支持的long类型中,然后ulong在访问时将其转换为.你可能会想:"等等,ulong的最大值>长的最大值!" 您仍然可以将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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该转换是unchecked为了防止溢出异常.

希望这有助于某人.

  • 如果您尝试处理大于 long 的数字怎么办? (2认同)

Jim*_*lor 8

更新 Entity Framework Core 2021 年 2 月

EF Core 3.1: EF Core 现在支持 long 和 ulong 类型。首先使用代码,将 long 或 ulong 映射到 EF Core 的新“十进制类型”

public ulong MyULong{ get; set; } //==> decimal(20, 0)
Run Code Online (Sandbox Code Playgroud)

ulong 导致数据库中定义的十进制数为 20 位,小数点右侧有 0 位,这足以存储 64 位 ulong。

EF 5: 感谢 @Tomasz 指出,在 EF 5 和 6 中,ulong 映射到 BigInt,而不是按照我原来的答案映射到 Decimal 类型,现在在上面的标题“EF Core 3.1”下