[英]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.