添加对象时默认ID值设置为-9223372036854774807

问题描述 投票:0回答:1

我有一个使用 Entity Framework Core 8 的 ASP.NET Core 8 项目。

这是我的

DbContext
:

public class MyDbContext : DbContext
{
    public MyDbContext (DbContextOptions<IguideDbContext> options) : base(options)
    {
    }

    public MyDbContext ()
    {
    }

    public int MyConvertToInt32(long? v)
    {
        return Convert.ToInt32(v);
    }

    public long MyConvertToInt64(int? v)
    {
        return Convert.ToInt64(v);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var intToLongConverter = new ValueConverter<long, int>(
            v => MyConvertToInt32(v),
            v => MyConvertToInt64(v));
       
        modelBuilder.Entity<UserModel>()
            .Property(t => t.UserId)
            .HasConversion(intToLongConverter);
       //xxxxxx
    }

    public DbSet<UserModel>? Users { get; set; }
}

这是

UserModel
课程:

[Table("Users")]
public class UserModel
{
     [Key]
     public long UserId { get; set; }
     public string EmailAddress { get; set; }
     public int  MemberId { get; set; }
     public string Password { get; set; }
}

这是我向数据库添加新对象的方法:

UserModel user = new UserModel();
user.EmailAddress = "aaa";
user.MemberId = 1;
user.Password = "1";

MyDbContext myDbContext = new MyDbContext();
myDbContext.Users.Add(user);

myDbContext.SaveChanges();

调用

myDbContext.SaveChanges();
时,会抛出此错误:

对于 Int32 来说值太大或太小。

经过调查,我发现这个错误是在调用

MyConvertToInt32
方法时抛出的,因为它试图将
-9223372036854774807
转换为 int。是
user.UserId
的值吗?

它应该是0,因为我还没有给它赋值。这个巨大的

-9223372036854774807
值是怎么出现的呢?

注意: 这是我用来解决该问题的解决方法。我用

try catch
改变了方法。但我还是想知道为什么那里有一个巨大的负值。

public int MyConvertToInt32(long? v)
{
    if (v == null)
    {
        return 0;
    }

    int result = 0;

    try
    {
        result = Convert.ToInt32(v);
    }
    catch (Exception e)
    {
        CommonLog.Error(e);
    }

    return result;
}

更多注意: 使用

optionsBuilder.EnableSensitiveDataLogging();
为 Entity Framework Core 启用更多日志后,我看到下面有用的输出。看来 EF Core 确实默认为 UserId 字段分配了很大的值。我不知道为什么要这样设计。

dbug: 2024-11-14 14:29:41.949 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking) 上下文“MyDbContext”开始使用键“{UserId:-9223372036854774807}”跟踪“用户”实体

asp.net-core entity-framework-core
1个回答
0
投票

当您执行“myDbContext.Users.Add(user);”时实体框架自动将用户对象添加到主键值作为长值。

如果您想禁用自动赋值,请使用以下方式。

[Table("Users")]
public class UserModel
{
     [Key]
     [DatabaseGenerated(DatabaseGeneratedOption.None)] //--- Add this
     public long UserId { get; set; }
     public string EmailAddress { get; set; }
     public int  MemberId { get; set; }
     public string Password { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.