我有一个使用 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;
}
更多注意事项:在我使用 为 Entity Framework Core 启用更多日志后optionsBuilder.EnableSensitiveDataLogging();
,我看到了以下有用的输出。看来 EF Core 确实默认为 UserId 字段分配了一个大值。我不知道为什么要这样设计。
dbug:2024-11-14 14:29:41.949 CoreEventId.StartedTracking[10806](Microsoft.EntityFrameworkCore.ChangeTracking)上下文'MyDbContext'开始使用键'{UserId:-9223372036854774807}'跟踪'User'实体
当您执行“myDbContext.Users.Add(user);”时,实体框架会自动将用户对象作为长值添加到主键值中。
如果您想禁用自动分配值,请使用以下方式。
您可以查看这个文档:
如果你不想自己生成PK,只需使用内置转换器