Использование DbContext Set () вместо предоставления в контексте
есть ли различия при выполнении следующих действий:
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>();
они эффективно делают то же самое, давая мне набор пользователей, но есть ли какие-либо большие различия, кроме того, что вы не подвергаете набор через свойство?
5 ответов
на Users свойство добавляется для удобства, поэтому вам не нужно помнить, что все ваши таблицы и что соответствующий класс для него, вы можете использовать Intellisense, чтобы увидеть все таблицы, контекст был разработан для взаимодействия. Конечный результат функционально эквивалентен использованию Set<T>.
вы получаете преимущество с прежним методом при использовании первых миграций кода, так как новые сущности будут обнаружены как таковые автоматически. В противном случае, я совершенно уверен, что они эквивалентны.
вот как я установил свой общий dbSet, работает просто отлично
DbContext context = new MyContext();
DbSet<T> dbSet = context.Set<T>();
это общая версия чего-то более явного, такого как
DbContext context = new MyContext();
DbSet<User> dbSet = context.Set<User>();
в любом случае, они одинаковы (когда T и User)
Я думаю, что есть какая-то разница. Позвольте мне привести пример, как в вопросе. Предположим, я хочу сделать любой пользователь.FirstName и пользователей.LastName (таблица пользователя имеет больше полей)
Method1:UsersContext.Users.Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);
метода Method2: (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'
Из Метода Method2:
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 ms.
Я думаю, что нет такой разницы между двумя подходами, кроме того, что Set<User>() больше подходит для реализации шаблонов доступа к данным, таких как Repository шаблон из-за общей природы Set<T>() метод.