[英]Entity Framework Core will not map to BigInteger
我需要使用BigInteger
class 来处理我的类的大整数,但是当尝试使用 EntityFramework Core 到 map 到数据库表时,我收到以下错误:
无法映射属性
AllianceRank.Reputation
,因为它是BigInteger
类型,它不是受支持的原始类型或有效的实体类型。 要么明确 map 这个属性,要么忽略它。
[Column("reputation")]
public BigInteger Reputation { get; set; }
似乎BigIntegers
不是支持的映射类型。 如何将其强制为 map,或以其他方式解决此问题?
实体框架必须对如何存储它做出假设。 例如,如果您正在使用SQL服务器,则bigint
不起作用,因为您的值可能大于或小于bigint
可能的值。 varchar
会更合适吗? 可能,但如果你真的认为它是一个数字,而不是说,一个标识符,要求EF查询这个数字将是有问题的。 从本质上讲,有一些不太模糊的类型,如long
或string
,你不会忘记如何将它存储到Entity Framework。
仅支持标量类型,字符串和byte []。 可用的最大标量类型是十进制。 哪个“仅”允许28-29位有效数字。
从EF Core 2.1开始,您可以在DbContext
类的OnModelCreating()
函数中定义数据模型时定义值转换 。
最好的部分是,这允许在读取或写入数据库时自动转换属性值!
因此,在您的情况下,您在C#中有一个BigInteger
属性( Reputation
),在MySQL中有一个相应的INT(25)
字段,您可以这样做:
var converter = new ValueConverter<BigInteger, long>(
model => (long)model,
provider => new BigInteger(provider));
modelBuilder
.Entity<AllianceRank>()
.Property(e => e.Reputation)
.HasConversion(converter);
PS您可能实际上想要使用可变长度string
类型(如VARBINARY)将值存储在MySQL而不是INT(25)
,因为C# BigInteger
存储更大的值,因此在转换为INT(25)
或C# long
。
用
public Int64 FieldName { get; set; }
在您的模型类中,它将是 SQL 中的“bigint”数据类型
对于在类似情况下收到此神秘错误消息的可怜的灵魂:
无法将“System.Int64”类型的 object 转换为“System.Decimal”类型。
您会假设实体框架会自动将 map 和 SQL 服务器 bigint(64 位无符号整数)转换为相应的 C# 长整数(也是 64 位无符号整数)...
因此,您必须在 DbContext 的 OnModelCreating(ModelBuilder modelbuilder) 方法中使用HasColumnType()提供一些指导,如下所示:
using Microsoft.EntityFrameworkCore;
namespace Some.Namespace
{
public class YourClassDbContext : DbContext
{
public YourClassDbContext(DbContextOptions<YourClassDbContext> options) : base(options)
{
}
public YourClassDbContext() {}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
/* omitted stuff for PK and index */
modelBuilder.Entity<ClassXYZ>().Property(t => t.Id).HasColumnType("long");
base.OnModelCreating(modelBuilder);
}
非常感谢上面的@Kelvin Lai,他的回答让我走上了正确的道路,以及https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions
我的问题通过以下方式解决:使用 int64 而不是 biginteger
public class MyClassName
{
[Key]
public Int64 TableId { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.