2017-01-19 9 views
0

私はExpressionとFuncの初心者です。一般的なエンティティフレームワークのマッピング

私はEFマッピングクラスでコードが重複しないようにしようとしていますが、悪いデータベースが残っています。

public class EntityMap : EntityTypeConfiguration<Entity> 
{ 
    public EntityMap() 
    { 
     Property(x => x.PropertyA.Property); 
     Property(x => x.PropertyB.Property); 
    } 
} 

PropertyAPropertyBが同じタイプであり、多くの財産 と、簡単な方法でこれをリファクタリングパラメータにx => x.PropertyAまたはPropertyBを渡すと行うことは可能です:

は、次の例のマップクラスを取りますProperty(x => x. methodParemeter Property);のようなもの?そしてどうやって ? このメソッドは、次のようなものになります。

private void SubMap(Expression<Func<Entity, SubEntity>> propertyExpression, string prefix) 
{ 
    Property(x => x.propertyExpression.Property) 
      .HasColumnName(string.Format("{0}{1}", prefix,"columnName")); 
} 
+0

これはどのような点で改善ですか? – DavidG

+0

私は質問を理解していませんあなたはclassAプロパティをクラスBのautomaticalyにマッピングしますか? –

+0

代わりに '.Property'は例えば' .MaxLength(50) 'を意味し、複数のプロパティでより密な構文でそれを呼びたいとします?だから、 '{f => f.PropertyA、f => f.PropertyB} .ForEach(p => p.MaxLength(50))'のようなものが必要ですか? – CodeCaster

答えて

0

基本クラスとインターフェイスを使用できます。

モデル

public interface IEntity 
{ 
    string PropertyA { get; set; } 
    string PropertyB { get; set; } 
} 

public class EntityA : IEntity { 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
} 

public class EntityB : IEntity 
{ 
    public string PropertyA { get; set; } 
    public string PropertyB { get; set; } 
} 

基本クラス

public abstract class IEntityMap<T> : EntityTypeConfiguration<T> where T : class, IEntity 
{ 
    protected IEntityMap() 
    { 
     this.Property(x => x.PropertyA); 
     this.Property(x => x.PropertyB); 
    } 
} 

マッパーの実装

あなたDbContextタイプにこれらを登録します。

public class EntityAMap : IEntityMap<EntityA> 
{ 
    public EntityAMap() : base() 
    { 
    } 
} 

public class EntityBMap : IEntityMap<EntityB> 
{ 
    public EntityBMap() : base() 
    { 
    } 
} 
関連する問題