如何在实体框架中使用 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以上是关于如何在实体框架中使用 unsigned int / long 类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)
如何在 dart/flutter 中声明 64bit unsigned int?
如何从 const char* 转换为 unsigned int c++
在 Visual Studio 2015 社区 C++ 中,如何修复警告 C4838:从 'unsigned int' 到 'int' 的转换需要缩小转换