【问题标题】:How to use unsigned int / long types with Entity Framework?如何在实体框架中使用 unsigned int / long 类型?
【发布时间】:2014-12-05 20:55:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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 以防止溢出异常。

    希望这对某人有所帮助。

    【讨论】:

    • 如果您尝试处理大于 long 的数字怎么办?
    • +1 关键字未选中。但是,为什么要在自动生成的 POCO 实体所在的级别进行编辑,例如首先在 EF 模型中?如果您通过派生新类和引用基属性的类型来扩展它们,那么此时它与类型转换没有什么不同,并且您的 POCO 保持完整。算术溢出可能会被忽略,但结果仍会被截断。
    • @DouglasGaskell:你以ulong 的身份工作。您只需将它们存储long。它们在 long 版本中没有意义,但这没关系,因为它们总是会转换回它们曾经的精确 ulong 值,这意味着你只需要在你想使用时将它们转换回来他们。但是,您不能进行数据库内计算,因为它们将使用“坏”长值。
    【解决方案2】:

    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”标题下

    【讨论】:

    • 您使用的是哪个版本?我试过 6.0.0(预览版)和 5.0.3,这两个版本都从 public ulong Test { get; set; } 生成 Test = table.Column<long>(type: "bigint", nullable: false),
    • 嗨@Tomasz 我正在使用EF Core 3.1。正如您所指出的,在以后的版本中,到十进制的映射似乎已更新为映射到“bigint”
    • 6.0.0-preview.2.21154.2 和 5.0.4 都在为我生成 table.Column(type: "decimal(20,0)", nullable: false)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多