我有一个使用 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}”跟踪“用户”实体
当您执行“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; }
}