35

次のことを行うときに違いはありますか?

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

Set<T>コンテキストの方法を使用する:

public class UsersContext : DbContext
{
}

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

これらは事実上同じことを行い、ユーザーのセットを提供しますが、プロパティを介してセットを公開していないこと以外に大きな違いはありますか?

4

6 に答える 6

27

このUsersプロパティは便宜上追加されているため、すべてのテーブルとそれに対応するクラスを覚えておく必要はありません。Intellisenseを使用して、コンテキストが相互作用するように設計されたすべてのテーブルを確認できます。最終結果は、を使用するのと機能的に同等Set<T>です。

于 2012-12-04T20:16:44.657 に答える
6

コードファースト移行を使用する場合、新しいエンティティが自動的に検出されるため、前者の方法を使用するとメリットがあります。そうでなければ、私はそれらが同等であると確信しています。

于 2012-12-04T20:03:43.603 に答える
3

これが私の汎用dbSetの設定方法であり、問​​題なく機能します

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

これは、次のような、より明示的なものの一般的なバージョンです。

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

いずれにせよ、それらは同じです(いつTであるかUser

于 2012-12-04T20:08:51.233 に答える
2

1つの違いは、Setメソッドは非エンティティを含む任意のタイプを取り、例外をスローせず、そのタイプの空のセットのみを返すことです。したがって、間違ったクラス名を入力すると、混乱する可能性があります。

于 2019-09-17T12:53:31.443 に答える
1

少し違いがあると思います。質問のように例を使用させてください。User.FirstNameとUser.LastNameに基づいてAnyを実行したいとします(ユーザーテーブルにはより多くのフィールドがあります)

方法1:UsersContext.Users.Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

方法2:(UsersContext.Set(typeof(User)) as IQueryable<User>).Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

SQLプロファイラーをチェックインしたところ、Method1で実行されたクエリは次のとおりです。

    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'

方法2から:

    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ミリ秒かかります。

于 2014-02-05T13:11:27.800 に答える
0

メソッドの一般的な性質のため、パターンのSet<User>()ようなデータアクセスパターンを実装するのに適していることを除いて、2つのアプローチの間にそのような違いはないと思います。RepositorySet<T>()

于 2012-12-04T20:03:49.327 に答える