2015-05-22 22 views
7

EF7 (Beta 4) için ondalık kesinlik ayarını şanssız olarak belirlemeye çalışıyorum.Entity Framework 7 Model oluşturucu için ondalık kesinlik ayarla

ben böyle bir şey yapmak bekliyordum: Bu kullanılabilir olması için görünmüyor

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).Precision(10, 6) 

ama GitHub'dan içinde depoda aşağıdaki sınıf bulabildim:

https://github.com/aspnet/EntityFramework/blob/7.0.0-beta4/src/EntityFramework.Relational/RelationalDecimalTypeMapping.cs

RelationalTypeMapping sınıflarını veya onlarla yöntem imzalarını kullanma örnekleri yoktur. Belki bu sadece bilgi almak için eşleme isminin bir parçası olarak kullanılır? ,

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().ColumnType() 

veya

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForSqlServer().ColumnType() 

Bunlar bir dize alır sadece henüz uygulanmadı bu işlevselliği ya da sadece aramıyorum:

Bunun olmasını bekliyoruz bir başka yer de şudur Doğru yerde?

Düzenleme: Sadece bu daha dışarı inşa edilene kadar bu dize ı tercih ediyorum gibi olsa bazı açıklama elde sakıncası olmaz yine .ColumnType ("ondalık (10,6)") çözümü türü için muhtemelen fark değil bu

Düzenleme için dizeleri kullanmak: açıklama sonra bricelam I dize kullanarak önlemek için şimdilik kullanmak için aşağıdaki uzantıyı oluştururken sona erdi ve ben onların yaklaşımı basitliği takdir:

public static RelationalPropertyBuilder DecimalPrecision(this RelationalPropertyBuilder propertyBuilder, int precision, int scale) 
    { 
     return propertyBuilder.ColumnType($"decimal({precision},{scale})"); 
    } 

Kullanım örneği:

modelBuilder.Entity<SomeClass>().Property(p => p.DecimalProperty).ForRelational().DecimalPrecision(10,6); 

Düzenleme: RC1

için yapma modifikasyon Ben henüz bu test etmedim, ama sadece bu muhtemelen RC1 ile nasıl görüneceğini 2 numuneleri aşağıdaki birlikte attı

public static PropertyBuilder DecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.HasColumnType($"decimal({precision},{scale})"); 
    } 

    public static PropertyBuilder SqlDecimalPrecision(this PropertyBuilder propertyBuilder, string precision, string scale) 
    { 
     return propertyBuilder.ForSqlServerHasColumnType($"decimal({precision},{scale})"); 
    } 

Henüz denemediğimden bu yana "HasColumnType" veya "ForSqlServerHasColumnType" arasındaki doğru kullanımın hangisi olacağından emin değilim, ancak umarım bu doğru olanı işaret eder.

+0

Tüm ondalık özelliklerim aynı hassaslığa sahip olduğundan, bunları tek bir satırda gerçekleştirmenin herhangi bir yolu var mı? Bunu EF6: 'modelBuilder.Properties () .Configure (x => x.HasPrecision (18, 6)); – GregoryHouseMD

+0

@reala valoro, RC1 değişikliklerini yansıtacak ayrıntıları güncelledim –

cevap

4

Çözümünüz, tasarladığımız tasarımdır. Bir grup "faset" yerine, hassas, ölçek, maksimum uzunluk, unicode/ansi, sabit/değişken uzunluk gibi bir tür ayarlayabilirsiniz. Basit tutmaya karar verdik: Varsayılan tipte eşleştirme İstediğiniz hangi tipte olduğunu bize söyleyin. Bu karara geri dönme ve “fasetleri” yeniden tanıtan görüşmeler oldu. Bu konuda güçlü hissediyorsanız, create a new issue numaralı telefonu kullanmanızı tavsiye ederim.

Ayrıca, şu anda tür eşlemesinde bir sürü başka hata olduğunu, ancak beta5'i yayınladığımız zamana göre düzeltilmeleri gerektiğini unutmayın.

+0

Netleştirme, soruyu, dizgeyi önlemek için oluşturduğum basit bir uzantıyla düzenledim. Yolda yeniden ortaya çıkanları görmekten hiç şaşırmam. Ama sizce bu, kızartmak için çok daha büyük balıklarınız olduğu için yaratılan bir sorunu garanti etmeyecektir :) Yaptığınız tüm işleri takdir ediyorum. EF7'yi daha fazla kullanmayı sabırsızlıkla bekliyorum! –

1

Gösterilen örnek EF RC1'e göre eskimiş görünüyor.

Ondalık bir alanda kesinliği nasıl ayarlıyorum.

manken yaratmaya dayalı, ben eşleme örneğini, benim bağlam sınıfında sonra bir varlık

public class Review 
{ 
    public int ReviewId { get; set; } 
    public decimal TotalScore { get; set; } //I want a precision field in DB 
    public DateTime CreatedOn { get; set; } 
    [Timestamp] 
    public byte[] RowVersion { get; set; } 
} 

var ki (orada eşleme yapabileceğini, ama ayrı tutmak istiyorum)

public class MyDbContext : DbContext 
{ 
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) 
    { 
    } 

    public DbSet<Review> Reviews { get; set; } 
    //etc. 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     //Mappings 
     new ReviewMap(modelBuilder.Entity<Review>()); 
     //etc.. 
    } 
} 

ve ardından eşleme. Model uzantılarının bulunduğu ad alanını kullanmayı unutmayın:

using Microsoft.Data.Entity; //here is where the extensions are 
public class ReviewMap 
{ 
    public ReviewMap(EntityTypeBuilder<Review> entityBuilder) 
    { 
     entityBuilder.HasKey(r => r.ReviewId); 

     //Using the column type extension 
     entityBuilder.Property(r => r.TotalScore) 
      .HasColumnType($"decimal(5,2)") 
      .IsRequired(true); 

     //and this has nothing to do with the example but it's interesting 
     //to show how to use Sql command to automatically fulfil a value 
     //when adding a new Entity 
     entityBuilder.Property(r => r.CreatedOn) 
      .ValueGeneratedOnAdd() 
      .HasDefaultValueSql("GETUTCDATE()") 
      .IsRequired(true); 
    } 
}