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

使用 Code-First 迁移时,前一种方法会为您带来好处,因为会自动检测到新实体。否则,我很确定它们是等价的。

于 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>();

无论哪种方式,它们都是相同的(什么时候TUser

于 2012-12-04T20:08:51.233 回答
2

一个区别是 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 profiler 中检查了 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 条记录,方法 1 大约需要 20 毫秒,而方法 2 大约需要 3500 毫秒。

于 2014-02-05T13:11:27.800 回答
0

我认为这两种方法之间没有这样的区别,除了因为方法的通用性Set<User>()更适合实现像模式这样的数据访问模式。RepositorySet<T>()

于 2012-12-04T20:03:49.327 回答