簡體   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