2017-12-21 11 views
1

エンティティ用の汎用設定クラスを作成しようとしていますが、固まっています。ここで私は同じコードで各1でのDateTimeプロパティを設定する必要があり、EntityBaseから継承EFコア2の汎用エンティティ設定クラス

public abstract class EntityBase 
{ 
    public int Id { get; set; } 
    public int TenantId { get; set; } 
    public DateTime CreatedOn { get; set; } 
    public DateTime UpdatedOn { get; set; } 
} 

そして、多くの他のクラス:

は私がEntityBaseと呼ばれる抽象クラスを持っています。この方法:

void EntityTypeConfiguration<MyEntity>.Configure(EntityTypeBuilder<MyEntity> builder) 
    { 
     builder.HasIndex(e => e.TenantId); 
     builder.Property(e => e.CreatedOn) 
       .ValueGeneratedOnAdd() 
       .HasDefaultValueSql("GETDATE()"); 

     // Other specific configurations here 
    } 

私は次のように気にいらを呼び出すことができるようにしたいと思います:builder.ConfigureBase()とコードの重複を避けます。何か案は?

+0

は、デフォルト値を設定するために、純粋に、この場合、またはこのシナリオでありますむしろ「自動的にそれらの値を挿入/編集する」のように? – Marco

+0

TenantIdをインデックスとして設定し、CreatedOnプロパティのデフォルト値を設定するだけです。 – alecardv

答えて

2

目的を達成する方法はいくつかあります。たとえば、IEntityTypeConfiguration<TEntity>のクラスを使用しているようだから、virtual void Configureメソッドを持つ基本ジェネリックコンフィグレーションクラスを作成し、具体的なコンフィグレーションクラスを継承させてConfigureメソッドをオーバーライドし、具体的な調整を行う前にbase.Configureを呼び出すことができます。

しかし、builder.ConfigureBase()を正確に呼び出せるようにしたいとしましょう。サンプル使用に

public static class EntityBaseConfiguration 
{ 
    public static void ConfigureBase<TEntity>(this EntityTypeBuilder<TEntity> builder) 
     where TEntity : EntityBase 
    { 
     builder.HasIndex(e => e.TenantId); 
     builder.Property(e => e.CreatedOn) 
       .ValueGeneratedOnAdd() 
       .HasDefaultValueSql("GETDATE()"); 

    } 
} 

:その構文を許可するには、単にこのようなカスタムジェネリック拡張メソッドに共通のコードを移動することができます

void IEntityTypeConfiguration<MyEntity>.Configure(EntityTypeBuilder<MyEntity> builder) 
{ 
    builder.ConfigureBase(); 
    // Other specific configurations here 
} 
+0

驚くばかり!それは完璧に働き、多くのおかげです。 – alecardv