2012-01-20 7 views
10

私は、エンティティフレームワークのための一般的なリポジトリを書き込み、これらの呼び出しの間に差があるものにと混乱していています:.CreateObjectSet <T>、.Set <T>、および.CreateQuery <T>の違いは?

ObjectContext.CreateObjectSet<T> 
ObjectContext.CreateQuery<T> 
DbContext.Set<T> 

私は両方とも最初の.edmxファイルから生成されたコンテキストだけでなく、コードをサポートしている一般的なリポジトリをしたいですDbContext、私はこれ持っている:私はすべての3が使用さ見てきたオンライン見てきた例では

public abstract class EntityRepository<TClass> 
    where TClass : class, new() 
{ 
    //private readonly TContext _context; 
    private readonly ObjectSet<TClass> _objectSet; 

    protected EntityRepository(IObjectContextAdapter context) 
    { 
     _objectSet = context.ObjectContext.CreateObjectSet<TClass>(); 

    } 

    protected EntityRepository(ObjectContext context) 
    { 
     _objectSet = context.CreateObjectSet<TClass>(); 
    } 

    public ObjectSet<TClass> Query() 
    { 
     return _objectSet; 
    } 
} 

を、それらの間の実際の違いは何ですか?パフォーマンスが向上していますか? 3つの方法すべてを使ってコンテキストに対してLINQクエリを書くことができます。

答えて

16

CreateObjectSet<T>は基本的にTオブジェクトのコレクションで、このコレクションからオブジェクトを追加、削除、削除、挿入、削除することができます。クエリを使用することもできます。これは、特定のエンティティの最上位ルートのようなものです。

CreateQuery<T>

はあなたに(それも IQueryable<T>です) IEnumerable<T>のように閲覧することができ ObjectQuery<T>を与えます。このオブジェクトは ObjectSet<T>(一部の条件など)のサブセットのようですが、アイテムなどを追加することはできません。

最後にSet<T>は、DbSet<T>を返します。これはコードファーストの最初のメソッド/オブジェクトの簡略版です。たとえば、これらのオブジェクトを使用することは簡単です(ユニットのテストなどのためには、インタフェース; IDbSet<T>)。ObjectContextDbContextと同じです。

+0

これらのそれぞれに対してデータベースに対してクエリを実行すると、実際にはパフォーマンスの違いはありませんか?私のケースでは、私のリポジトリが実際のコンテキストを格納していないので、私はObjectSetを選択する正しい道を進んだと言いますので、すべてのCRUD操作を行うことができますか? – SventoryMang

+2

基本的には、ObjectSet :ObjectQuery です。いずれかを使用してクエリを構築するかどうかは、クエリの実行に影響しません。 CreateQuery(私たちはいくつかのメタデータルックアップを行う)と比較してCreateObjectSetへの呼び出しに最小限のオーバーヘッドがありますが、このオーバーヘッドが現実世界に目に見える影響があれば驚くでしょう。 Set のDbContext APIへの実装は、実際には他のメソッドよりも薄いレイヤーです。重大な影響はありません。また、DbContext全体がAPIを使用する方がはるかに簡単で簡単です。 – divega

4

Jiriがすでに説明したことに加えて、引数を取らないCreateObjectSetのオーバーロードがあります。このオーバーロードは、TEntityに関連付けられた唯一のEntitySetのObjectSetを返さなければならないと自動的に想定します。モデルにMEST(型ごとに複数エンティティセット)がある場合はスローされます。 CreateQueryのすべてのオーバーロードには、クエリをブートストラップするEntity SQL文字列が必要です(EntitySetの名前は有効なEntity SQLクエリです)。

関連する問題