3

異なる種類の人(バイヤー、売り手、エージェントなど)を格納するPersonsテーブルがあります。私たちのORMはEntity Framework CodeFirst(CTP5)です。私たちは良いTDDとモックのためにリポジトリパターンを使用しています。 PersonRepositoryで私はこのようなことを行うことができますので、特定の型を返すようにしたい:Generics and Entity Framework:列の値に応じて異なる型を返す方法

Agent a = repository.Get<Agent>(5005); // Where 5005 is just an example Id for the person 
a.SomeAgentProperty = someValue; 
Buyer b = repository.Get<Buyer>(253); // Again, a simple PersonId. 
b.SomeBuyerProperty = someOtherValue; 

アイデアは、私はリポジトリからそれを得るとき、私は取得していますどんな人か知っていることです。そして、はい、私はちょうどGetBuyer(int PersonId)、GetSeller(int PersonId)というXのGetメソッドを作成することができます。しかし、それはコードのにおいを持っています。

ジェネリック関数はどのように見えますか?ここで

は私のリポジトリのインターフェースは、これまでのところです:

public interface IPersonRepository 
{ 
    Person Get(int PersonId); // To get a generic person 
    T Get<T>(int PersonId);  // To get a specific type of person (buyer, agent, etc.) 
    void Save(Person person); 
    void Delete(int p); 
} 

そして、私の具体的な実装:

public T Get<T>(int PersonId) 
    { 
     //Here's my question: What goes here? 
    } 

答えて

1

私はのようなものを使用することをお勧め:

public T Get<T>(int PersonId) where T: new() 
{ 
    return new T(PersonId); 
} 

と負荷データがでコンストラクタ、またはあなたのエンティティの各タイプのための何らかの種類のLoadメソッドを実装してください:

interface IEntity 
{ 
    void Load(int Id); 
} 

class CBuyer: IEntity 
{ 
    public Load(int Id) { ... } 
} 

public T Get<T>(int PersonId) where T: IEntity, new() 
{ 
    T ent = new T(); 
    ent.Load(PersonId); 
    return ent; 
}  
+0

? –

3

あなたはTPT、またはあなたは、TPHを使用した場合の識別器に基づいてフィルタを使用している場合INNERは、指定されたTに登録しようやってEFになりますOfType<T>()メソッドを使用します。

public TPerson Get<TPerson>(int PersonId) where TPerson : Person 
{ 
    return ctx.People 
       .OfType<TPerson>() 
       .SingleOrDefault(x => x.PersonId == PersonId); 
} 

そして、それはあなたが望んでいただけのように動作します:私はどのようにコンテキストを取得しない、読み込み用のコードを見ることがしたい

Agent a = repository.Get<Agent>(5005); 
関連する問題