如何在实体框架中使用 unsigned int / long 类型?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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)跨度>

以上是关于如何在实体框架中使用 unsigned int / long 类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架中用枚举替换 Int 属性?

如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)

如何在 dart/flutter 中声明 64bit unsigned int?

如何从 const char* 转换为 unsigned int c++

在 Visual Studio 2015 社区 C++ 中,如何修复警告 C4838:从 'unsigned int' 到 'int' 的转换需要缩小转换

如何在python中将unsigned char类型的int字符串转换为int