2010-12-14 15 views
1

私はEF 4に汎用リポジトリを書き込もうとします。しかし、私のコードは良く見えません。 ExpressionEntitiesはGENERICではないためです。EF4で汎用エンティティ名をコンストラクタに書き込む方法は?

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private GetGenericEntityCONTEXT _context; 

    public DataRepository() 
    { 
    } 

    public DataRepository(GetGenericEntityCONTEXT context) 
    { 
     _context = context; 
    } 
} 

私の実体をグローバルではないExpressionsEntitiesので:ExpressionsEntities1、ExpressionsEntities 2、ExpressionsEntities 3 ETXが...私がする必要がある次へ

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private ExpressionsEntities _context; 
    public DataRepository() 
    { 
    } 

    public DataRepository(ExpressionsEntities context) 
    { 
     _context = context; 
    } 
} 

私はこのコードを変換したいです例えば次のようにエンティティを取得してください:

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private Entity _context; 
    public DataRepository() 
    { 
    } 

    public DataRepository(Entity context) 
    { 
     _context = context; 
    } 

    public class Main 
    { 
     main() 
     { 
      new DataRepository(ExpressionEntities) 
     } 
    } 
} 

答えて

1

その後

public class DataRepository<T> : IRepository<T> where T : class 
{ 
    private ObjectContext _ctx; 

    public DataRepository<T>(ObjectContext ctx) 
    { 
     this._ctx = ctx; 
    } 

    public IObjectSet<T> CurrentEntitySet<T>() 
    { 
     get 
     { 
      var entityName = _plularizer.Pluralize(typeof(T).Name); 
      string entitySetName = string.Format("{0}.{1}", EntityContainerName, entityName); 
      return _ctx.CreateObjectSet<T>(entitySetName); 
     } 
    } 
} 

あなた特定リポジトリ: - 帽子あなたの提示、私が理解することができたものから、あなたはへの道をwan't動的は十分に簡単ですT.

まあ基づいてエンティティセットを作成します

: - 好ましくはDIによって

public class AppleRepository : DataRepository<Apple> 
{ 
    public AppleRepository(IObjectContext ctx) : base(ctx) {} 

    public ICollection<Apple> FindApples(Func<Apple,bool> predicate) 
    { 
     return CurrentEntitySet.Where(predicate).ToList(); 
    } 
} 

そして、あなたがあなたのリポジトリを作成し、オブジェクトコンテキストを通過:この(例)を行うことができます

var repository = new AppleRepository(new ExpressionEntities()); // should be DI'ed 

基本的に、我々は複数化(エンティティセットの名前を複数形するエンティティフレームワークで使用されるのと同じコード)を利用して、CreateObjectSet<T>ています。だから、

あなたは(あなたのモデルに設定されたエンティティと一致する必要があります)リンゴのエンティティセット名に変換しますDataRepository<Apple>を作成し、我々はそれに基づいてエンティティセットを作成した場合。

EntityContainerNameプロパティはEDMX上にあります。これをctorに渡す必要があります(好ましくはDI経由)。

あなたの質問にお答えしますか?

+0

Loo上記のコード:私のコードはgenericですが、ExpressionsEntitiesは上記のコードに基づいていません。すべてのエンティティを記述する必要があります。 – Penguen

+0

@Phsika - "ExpressionEntities"とは何ですか - あなたのデータコンテキストですか?私は推測して、はいと答え、私の答えを更新します。 – RPM1984

+0

そして、エンティティごとにリポジトリは必要ありません。集約ルート*ごとにリポジトリ*が必要です。集約ルートごとにインターフェイスを作成し、DataRepository または特定のリポジトリ(DataRepository から派生し、インターフェイス契約を満たす)を挿入します。ジェネリックリポジトリ全体のポイントは、実装の数を減らすことです。 – RPM1984

1

私はこのようなentityNameを取得することをお勧めします。

EntityContainer container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);

EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(typeof(T).Name)).FirstOrDefault();

var entityName = entitySet.Name

あなたは複数形いくつかのクラス、およびいくつかのクラスを持っていない場合、これはいくつかのケースを扱います。

関連する問題