【问题标题】:EF Core automatically converting ulong to longEF Core 自动将 ulong 转换为 long
【发布时间】:2021-07-14 20:44:30
【问题描述】:

我对实体框架核心有疑问。我正在尝试将DbUser 添加到数据库中。

public class DbUser
{
    public int Id { get; set; } 
    public ulong DiscordId {get; set; }
    public int Points { get; set; } = 0;
    public bool Daily { get; set; } = true;
}


using (var context = new DiscordContext())
{
    context.Database.EnsureCreated();

    var user = new DbUser()
                   {
                       DiscordId = (ulong) 332282501902893056
                   };

    context.Users.Add(user);
    context.SaveChanges();
}

当我保存更改时,它会引发异常。

System.InvalidCastException:无法将“System.UInt64”类型的对象转换为“System.Int64”类型。

在 Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer`1.Equals(Object left, Object right)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.LocalDetectChanges(InternalEntityEntry 条目)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ChangeDetector.DetectChanges(IStateManager stateManager)
在 Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker.DetectChanges()
在 Microsoft.EntityFrameworkCore.DbContext.TryDetectChanges()
在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
在 bot.Program.Main(String[] args) in -----------------:line 22

我只是无法添加 ulong 值,因为它会自动转换为 long。

【问题讨论】:

  • 你能显示你的数据库创建表脚本吗?
  • 这里是链接pastebin.com/sabj9C4u
  • 将其更改为long 是否有效? public long DiscordId {get; set; }

标签: c# entity-framework .net-core entity-framework-core


【解决方案1】:

EF Core 的旧版本(2 月 2 日之前)不支持 ulong。

我可以在您的表用户脚本中看到 DiscordId 表列的类型很长

  DiscordId = table.Column<long>(type: "bigint unsigned", nullable: false),

您只需将 dbuser 类的 DiscardId 更改为相同

 public long DiscordId {get; set; }

我发现MySql没有UInt64,它只有Int64类型。所以也许你将不得不使用这样的属性


[NotMapped]
public ulong DiscordId {
get {return DiscordDbId;}
set {DiscordDbId=(long)value; }
}

 [Column("DiscordId")]
 public long DiscordDbId {get; set; }

您可以使用 DiscordDbId 来处理 dbcontext,但之后您可以使用 DiscordId 来处理您的第三方框架。

【讨论】:

  • 对我来说问题是我无法实现它,我尝试迁移但没有任何工作我在迁移脚本中仍然存在很长时间。
  • 是的,它有效,但对我来说真正的问题是我不能放在那里ulong,如果我要切换到long,我必须在比较时将ulong转换为long,初始化等等,因为 DsharpPlus 正在返回用户的 ulong id。 Ef核心版本:5.0.8
  • 您是否尝试在创建脚本中手动更改它?
  • 调试器的反应还是一样
  • 您可以添加 NotMapped 属性来隐藏演员表。或者也许是一个价值转换器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2020-04-24
相关资源
最近更新 更多