Voglio impostare la precisione di tutte le proprietà decimali su (18,6). In EF6 questo è stato abbastanza facile:
modelBuilder.Properties<decimal>().Configure(x => x.HasPrecision(18, 6));
ma non riesco a trovare nulla di simile a questo in EF Core. La rimozione della convenzione di eliminazione a cascata non era semplice come in EF6, quindi ho trovato la seguente soluzione:
EF6:
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
EF core:
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
relationship.DeleteBehavior = DeleteBehavior.Restrict;
e dopo aver letto questo , ho provato un approccio simile:
foreach (var entityType in modelBuilder.Model.GetEntityTypes()
.SelectMany(x => x.GetProperties())
.Where(x => x.ClrType == typeof(decimal)))
{
// what to do here?
}
Mi piacerebbe se fossi sulla buona strada e su come continuare, o se no, dovrei iniziare a inserire annotazioni di dati su tutte le proprietà decimal
.
Ti sei avvicinato. Ecco il codice.
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(decimal)))
{
// EF Core 1 & 2
property.Relational().ColumnType = "decimal(18, 6)";
// EF Core 3
//property.SetColumnType("decimal(18, 6)");
}
Nota: se si dispone di tipi nullable come decimal?
, uso:
Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?))