实体框架核心不会映射到BigInteger

时间:2017-01-25 04:43:44

标签: c# entity-framework-core

我需要使用for (var i = 0; i < 10; i++) { asynccall("Hello", function (others, err, data) { console.log("Others is same as i in synchrnous call " + others); }.bind(this, i)); } 类来处理我的类的大整数,但是当尝试使用EntityFramework Core映射到DB表时,我收到以下错误:

  

无法映射属性BigInteger,因为   它的类型为AllianceRank.Reputation,不受支持   基本类型或有效实体类型。要么明确地映射这个   财产,或忽略它。

BigInteger

[Column("reputation")] public BigInteger Reputation { get; set; } 似乎不是支持的映射类型。如何强制它映射,或以其他方式解决此问题?

4 个答案:

答案 0 :(得分:2)

实体框架必须对如何存储它做出假设。例如,如果您使用的是SQL服务器,则bigint不起作用,因为您的值可能大于或小于bigint的值。 varchar会更合适吗?可能,但如果你真的认为它是一个数字,而不是说,一个标识符,要求EF查询这个数字将是有问题的。从本质上讲,有一些不太模糊的类型,例如longstring,您不会在如何将其存储到实体框架中进行猜测。

答案 1 :(得分:1)

仅支持标量类型,字符串和字节[]。 可用的最大标量类型是十进制。哪个&#34;只有&#34;允许28-29位有效数字。

答案 2 :(得分:0)

从EF Core 2.1开始,在OnModelCreating()类的DbContext函数中定义数据模型时,可以定义Value Conversions

最好的部分是,这允许在读取或写入数据库时​​自动转换属性值!

因此,在您的情况下,您在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);

P.S。您实际上可能想使用变长string类型(如VARBINARY)将值存储在MySQL中,而不是INT(25),因为C#BigInteger存储的值大得多,因此会导致异常转换为INT(25)或C#long时。

答案 3 :(得分:0)

使用

public Int64 FieldName { get; set; }

在您的模型类中,它将是 SQL 中的“bigint”数据类型