web-dev-qa-db-ja.com

Entity Framework Core-10進数の精度とスケールをすべての10進数プロパティに設定

すべての10進数プロパティの精度を(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コア:

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    relationship.DeleteBehavior = DeleteBehavior.Restrict;

this を読んだ後、同様のアプローチを試みました。

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

正しい軌道に乗っていて、どのように続行するか、またはそうでない場合は、すべてのdecimalプロパティにデータ注釈を付け始める必要があります。

29
GregoryHouseMD

あなたは近づいた。これがコードです。

foreach (var property in modelBuilder.Model.GetEntityTypes()
    .SelectMany(t => t.GetProperties())
    .Where(p => p.ClrType == typeof(decimal)))
{
    property.Relational().ColumnType = "decimal(18, 6)";
}

注:decimal?としてNULL可能型がある場合は、次を使用します。

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