繁体   English   中英

Entity Framework Core 不会 map 到 BigInteger

[英]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查询这个数字将是有问题的。 从本质上讲,有一些不太模糊的类型,如longstring ,你不会忘记如何将它存储到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM