1

EF 4.0 に対してリポジトリ パターンを使用する際に、関数インポートの使用をどのように実装したかについて、誰かアドバイスしてもらえますか?

候補エンティティにマップされたテーブルと、候補にマップされた既存の sproc からの関数インポートもあります。これは EF でうまく機能しますが、T が POCO エンティティである IObjectSet のコンストラクターを取るリポジトリを使用して抽象化しています。ただし、これは関数インポートへの参照を取得できないことを意味します。これを実行する唯一の方法は、ObjectContext への参照を、それを必要とするリポジトリに渡すことですが、これは私には少しデザインの臭いのように感じます。

リポジトリのいくつかはカスタム インターフェイスで拡張されていますが、依然として同じ問題に直面しています。

    public class CandidateRepository : Repository<Candidate>, ICandidateRepository
{
    public CandidateRepository(IObjectSet<Candidate> entities)
        : base(entities)
    {
    }

    public Candidate GetByEmail(string email)
    {
        return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email));
    }

    public bool CandidateExists(string candidateNumber)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null;
    }

    public Candidate GetByNumber(string number)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(number));
    }

    public Candidate GetMember(string number)
    {

        return new Candidate();  //This one needs to return from the Function Import
    }
}

アドバイスをいただければ幸いです。

4

2 に答える 2

1

問題を直接解決するには、にキャストentitiesしてプロパティをObjectSet<T>使用して取得できます。entites.ContextObjectContext

public Candidate GetMember(string number)
{
    var objectSet = Enities as ObjectSet<Candidate>;

    if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");        

    return objectSet.Context.MyCustomFunction(string number);
}

ご覧のとおり、このコードは特定のIObjectSet実装に依存しており、まったく適切ではありません。

各テーブルではなく、集約ルートのみのリポジトリを作成することをお勧めします。ObjectContextしたがって、リポジトリ ctorに渡す方が自然です。

于 2010-06-29T11:40:07.477 に答える
0

私はこの道をたどりましたが、ObjectContext のインターフェース実装をリポジトリに渡すときの痛みが少ないことを経験しました。インターフェイスの実装には、関数を呼び出す何らかの方法が必要です。したがって、ObjectContext の具体的な実装を渡すと、すべてが正常に機能するはずです。

于 2010-07-08T20:58:32.687 に答える