2017-07-05 4 views
1

は私がseperatlyすべてのビルダー方法でこれらのフィールドプロパティを割り当てたくない私の私のコンテキストビルダで同じ基底クラス今EF6コードまず、コンテキストフルエントAPI:複数のエンティティに同じフィールドプロパティを設定する方法は?

public class BaseEntity 
{ 
    public string CreatedUser { get; set; } 
    public DateTime? CreatedDate { get; set; } 
    public string ChangedUser{ get; set; } 
    public DateTime? ChangedDate { get; set; } 

} 

から継承されたのserveral entitesを持っています。

私は

private static void BasisFields(DbModelBuilder modelBuilder, Entity<TEntity> entitiy) 
{ 
    modelBuilder.entitiy() 
     .Property(k => k.CreatedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    modelBuilder.entitiy() 
     .Property(k => k.CreatedDate) 
     .HasColumnType("datetime"); 

    modelBuilder.entitiy() 
     .Property(k => k.ChangedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    modelBuilder.entitiy() 
     .Property(k => k.ChangedDate) 
     .HasColumnType("datetime"); 

} 

のように各entitiyビルダーメソッドに追加することができます。しかし、私はC#の初心者ですので、上記のコードは、正しくない一般的な方法をしたい...それをしない方法

のように見える?

答えて

2

あなたは方法は、一般的なことができます:

private static void BasisFields<T>(DbModelBuilder modelBuilder) 
    where T : BaseEntity 
{ 
    modelBuilder.Entity<T>() 
     .Property(k => k.CreatedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    modelBuilder.Entitity<T>() 
     .Property(k => k.CreatedDate) 
     .HasColumnType("datetime"); 

    modelBuilder.Entity<T>() 
     .Property(k => k.ChangedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    modelBuilder.Entity<T>() 
     .Property(k => k.ChangedDate) 
     .HasColumnType("datetime");  
} 

where T : BaseEntityが確実に一般的な制約はあなただけBaseEntityを継承し、メソッド本体内部のBaseEntityのプロパティにアクセスすることができますタイプでそれを呼び出すことができます。今

あなたがBaseEntityを継承するすべてのエンティティのために、そのプロセスを自動化したい場合は、DbModelBuilder.Types<T>メソッドを使用することができますBaseEntity

BasisFields<DerivedEntityA>(modelBuilder); 
BasisFields<DerivedEntityB>(modelBuilder); 
... 

のように継承するすべてのエンティティのためにそれを呼び出す必要があります:

汎用引数で指定された型を継承または実装するモデル内のすべてのエンティティおよび複合型に適用される軽量規則の構成を開始します。

ので、代わりの方法を書き込み、すべての派生したエンティティのためにそれを呼び出して、あなたは簡単に使用することができます。

modelBuilder.Types<BaseEntity>().Configure(c => 
{ 
    c.Property(k => k.CreatedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    c.Property(k => k.CreatedDate) 
     .HasColumnType("datetime"); 

    c.Property(k => k.ChangedUser) 
     .HasMaxLength(32) 
     .HasColumnType("varchar"); 

    c.Property(k => k.ChangedDate) 
     .HasColumnType("datetime");  
}); 
+0

まさに私が探していた厥。ありがとうございました。 – Florian

関連する問題