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
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) –
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. –
@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