2012-12-04 20 views
18

はどんな違いがある代わりに、文脈にさらすことDbContextセット ():これらは、効果的に行う 使用して、次の実行時に

public class UsersContext : DbContext 
{ 
} 

var db = new UsersContext(); 
var users = db.Set<User>(); 

:コンテキストのSet<T>方法を使用して対

public class UsersContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
} 

同じこと、私にユーザーのセットを与えるが、プロパティを介してセットを公開していない以外の大きな違いは何ですか?

+0

@abatishchev http://msdn.microsoft.com/en-us/library/gg696521(v=vs.103).aspx設定がありません方法 – Dismissile

+0

確かに、ありがとう、愚かな私:) – abatishchev

答えて

10

便宜のためにUsersプロパティが追加されているため、y私たちのテーブルがあり、それに対応するクラスがあれば、Intellisenseを使って、インタラクションするためにコンテキストが設計されたすべてのテーブルを見ることができます。最終的な結果は機能的にSet<T>を使用することと同等です。

+1

ユーザーはコンテキスト内で1つだけのインスタンスになる可能性があります。私はSetメソッドについても疑問に思います。 –

5

Code-Firstマイグレーションを使用すると、新しいエンティティが自動的に検出されるため、前者の方法で利益を得ることができます。さもなければ、私はそれらが同等であると確信しています。

+0

私はしましたマイグレーションを考えないでください! – Dismissile

0

私はSet<User>()が原因Set<T>()方法の一般的な性質のRepositoryパターンのようなデータ・アクセス・パターンを実装するために、より適している除く二つのアプローチの間には、このような差はないと思います。

+0

ええ、一般的なリポジトリの用途はどこにあるのか分かりますが、そこに不利な点があったのか不思議でした。 – Dismissile

+0

しかし、一般的なDbSet もあります。 – Legends

2

これは、私は私のジェネリックdbSetを設定する方法です。これは、いずれかの方法で、このような

DbContext context = new MyContext(); 
DbSet<User> dbSet = context.Set<User>(); 

として、より明示的な何かのジェネリック版であるだけで結構

DbContext context = new MyContext(); 
DbSet<T> dbSet = context.Set<T>(); 

を動作しますが、彼らは(同じですTUserの場合)

+0

Err ...大丈夫ですか?私はそれがどのように機能するか理解しています違いや限界が何であるか知りたかったのです。 – Dismissile

+2

@Dismissile - 一般的な定義を使用して型を渡すことで、いくつかの繰り返しコードを節約することができる点を除いて、制限や相違はありません。 –

+0

Set <>は、制限や相違がないことを伝えるために、常に単一のインスタンスを返す必要があります。 –

2

多少の違いがあると思います。 質問の例を使ってみましょう。私は、クエリが発射SQLプロファイラで確認(UsersContext.Set(typeof(User)) as IQueryable<User>).Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

UsersContext.Users.Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

方法2: は私がUser.FirstNameとUser.LastNameに基づく任意の(Userテーブルには複数のフィールドを持っている)

メソッド1をやりたいと仮定します方法1である:方法2から

exec sp_executesql N'SELECT 
CASE WHEN (EXISTS (SELECT 
    1 AS [C1] 
    FROM [dbo].[User] AS [Extent1] 
    WHERE (((LOWER([Extent1].[FirstName])) = (LOWER(@p__linq__0))) AND ((LOWER([Extent1].[LastName])) = @p__linq__1) 
)) THEN cast(1 as bit) WHEN (NOT EXISTS (SELECT 
    1 AS [C1] 
    FROM [dbo].[User] AS [Extent2] 
    WHERE (((LOWER([Extent2].[FirstName])) = (LOWER(@p__linq__0))) AND ([Extent2].[LastName] = @p__linq__1) 
)) THEN cast(0 as bit) END AS [C1] 
FROM (SELECT 1 AS X) AS [SingleRowTable1]',@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'jack',@p__linq__1=N'saw' 

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[Email] AS [Email], 
.......other fields...... 
FROM [dbo].[Users] AS [Extent1] 

テーブルには40000個のレコードがあり、Method1は約20ミリ秒、Method2は約3500ミリ秒かかります。

+0

セットは汎用パラメータを取ることができます。試してみてください().Any(...) – Dismissile

+0

@Dismissile私は().Any()を設定しようとしました。 – maicalal

+0

3つのメソッドすべてが私にとって同じ正確なクエリを生成するので、あなたは非常に奇妙なことをしています。 – Dismissile

関連する問題