Tenho um projeto ASP.NET Core 8 usando o Entity Framework Core 8.
Este é meu 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; }
}
Esta é a UserModel
classe:
[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; }
}
Veja como adiciono um novo objeto ao banco de dados:
UserModel user = new UserModel();
user.EmailAddress = "aaa";
user.MemberId = 1;
user.Password = "1";
MyDbContext myDbContext = new MyDbContext();
myDbContext.Users.Add(user);
myDbContext.SaveChanges();
Ao chamar myDbContext.SaveChanges();
, ele gera este erro:
O valor era muito grande ou muito pequeno para um Int32.
Após investigação, descobri que esse erro é lançado ao chamar MyConvertToInt32
o método, porque ele está tentando converter -9223372036854774807
para int. É o valor de user.UserId
?
Deveria ser 0 porque eu nunca atribuí um valor a ele ainda. Como esse -9223372036854774807
valor enorme aparece?
Nota: Aqui está a solução alternativa que usei para resolver o problema. Mudei o método com try catch
. Mas ainda quero saber por que há um enorme valor negativo ali.
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;
}
Mais Nota: Depois que eu habilito mais log para o Entity Framework Core com optionsBuilder.EnableSensitiveDataLogging();
, vejo a saída útil abaixo. Parece que o EF Core realmente atribui um grande valor ao campo UserId por padrão. Não sei por que ele foi projetado assim.
dbug: 2024-11-14 14:29:41.949 CoreEventId.StartedTracking[10806] (Microsoft.EntityFrameworkCore.ChangeTracking) Contexto 'MyDbContext' começou a rastrear a entidade 'Usuário' com a chave '{UserId: -9223372036854774807}'