2017-01-04 34 views
8

olarak ayarlamak için tüm EF Modellerindeki tüm özelliklerle döngü/yansıtma İstemcim ondalık (13,4) belirtimiyle SQL Server ondalık değerlerini kaydetme standardına sahiptir. Sonuç olarak, çok büyük ve hala büyüyen şemada, neredeyse yüz Bu gibi ifadeler var: Bütün ondalık sayılar ondalık olmalıdır doğrudan o EF (13 söyleyebilir bir özellik yoksaSütun Türünü

builder.Entity<MyObject>() 
    .Property(x => x.MyField1) 
    .ForSqlServerHasColumnType("decimal(13,4)"); 
builder.Entity<MyObject>() 
    .Property(x => x.MyField2) 
    .ForSqlServerHasColumnType("decimal(13,4)"); 
builder.Entity<MyObject2>() 
    .Property(x => x.MyField1) 
    .ForSqlServerHasColumnType("decimal(13,4)"); 

, 4) varsayılan olarak bunu kullanmak isterim. Değilse, yansıma döngüsünü modeldeki her nesne/özellikten kullanabilir miyim? Böylece bunu birkaç deyimde yapabilirim?

şey gibi: o zaman bir nesne bir Ad ve Açıklama varsa, Ad gerekiyor ve sınırlıdır nerede diğer sözleşmelerin bazı uygulayabilirsiniz çünkü

foreach(var efObj in EntityFrameWorkObjects) 
{ 
    foreach (var objProperty in efObj) 
    { 
     if (objProperty is decimal || objProperty is decimal?) 
     { 
      builder.Entity<efObj>() 
       .Property(x => x.efObj) 
       .ForSqlServerHasColumnType("decimal(13,4)"); 
     } 
    } 
} 

Yansıma, gitmek için harika bir yol gibi görünüyor 256 karaktere.

Güncelleme: Ben Ivan'ın yorumunda bağlantıyı takip ve benim için çalışıyor, hangi buna uyarlanmış:

foreach (var p in builder.Model 
    .GetEntityTypes() 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => 
     p.ClrType == typeof(decimal) || 
     p.ClrType == typeof(decimal?))) 
{ 
    p.SqlServer().ColumnType = "decimal(13,4)"; 
} 

Kısa bir süre sonra ben çalışmak için biraz değişmiş tam cevap, sağlanan Hem ondalık hem de ondalık ondalık sayısı:

foreach (var pb in builder.Model 
    .GetEntityTypes() 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => 
     p.ClrType == typeof(decimal) || 
     p.ClrType == typeof(decimal?)) 
    .Select(p => 
     builder.Entity(p.DeclaringEntityType.ClrType) 
      .Property(p.Name))) 
{ 
    pb.ForSqlServerHasColumnType("decimal(13,4)"); 
} 

Her iki yaklaşım da çalışır!

Güncelleme 2: Nesnelerimin yukarıdaki gibi çalışması için bağlamda DbSet <> olarak bildirilmiş olması gerekiyordu. Özellik satırını ayarladığımda bu gerekli görünmüyordu. EF Çekirdek V1.1.0 olarak

+1

bakınız [Tüm dize özellik maksimum uzunluğunu değiştirmek] (http://stackoverflow.com/questions/41427030/change-all-string -property-max-length/41427828 # 41427828) v1.1.0'da benzer bir şey için (v.1.0'da test yapamazsınız) –

+1

Güncelleme 2 ile ilgili olarak: Kod, tüm varlık türlerinden sonra “OnModelCreating” in sonunda olmalıdır. Örneğin, "modelBuilder.Entity <..>" çağrıları ile tanıtılan "DbSet" türlerini içermeyen keşfedildi. –

+0

@IvanStoev bu mantıklı, ama ben sadece ondalık sütun türü belirtmek için orada bazı 'modelBuilder.Entity <..>' ifadeleri vardı, bu yüzden bu ifadeler artık gitti. – Chris

cevap

18

böyle bir şey kullanabilirsiniz:

foreach (var pb in modelBuilder.Model 
    .GetEntityTypes() 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => p.ClrType == typeof(decimal)) 
    .Select(p => modelBuilder.Entity(p.DeclaringEntityType.ClrType).Property(p.Name))) 
{ 
    pb.ForSqlServerHasColumnType("decimal(13,4)"); 
} 
+2

Bu, en azından ef core 2.0 için biraz değişti. ForSqlServer yerine, Microsoft.EntityFrameworkCore.SqlServer nuget'i kullanmanız gerekir. Uzantı HasColumnType olarak adlandırılmıştır. – Joshit

+0

pb.HasColumnType ("ondalık (13,4)"); SqlServer kullanıyorsa doğru olur – Joshit

İlgili konular