Entity Framework Core - установка десятичной точности и масштабирования для всех десятичных значений

Я хочу установить точность всех десятичных свойств (18,6). В EF6 это было довольно просто:

modelBuilder.Properties<decimal>().Configure(x => x.HasPrecision(18, 6));

но я не могу найти ничего похожего на это в EF Core. Удаление соглашения об исключении каскада было не таким простым, как в EF6, поэтому я нашел следующее обходное решение:

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;

и после того, как я прочитал этот, я попробовал аналогичный подход:

foreach (var entityType in modelBuilder.Model.GetEntityTypes()
    .SelectMany(x => x.GetProperties())
    .Where(x => x.ClrType == typeof(decimal)))
        {
            // what to do here?
        }

Я хотел бы, если бы я был на правильном пути и как продолжить, или если нет, я должен начать помещать аннотации данных во все свойства decimal.

Ответ 1

Вы подошли близко. Здесь код.

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)");
}

Примечание: если у вас есть обнуляемые типы как decimal?, используйте:

Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?))