2013-12-12 3 views
2

Это мой первый пост :) Я новичок в MVC .NET. И у вас есть некоторые вопросы в отношении функциональности и производительности Entity Framework. Вопросы рядный ...Entity Framework, DbSet <T>, Dispose() вопросы производительности

class StudentContext : DbContext 
{ 
    public StudentContext() : base("myconnectionstring") {}; 
    public DbSet<Student> Students {get; set; } 
    ... 
} 

Вопрос: прочитать ли DbSet все записи из Студенческой таблицы базы данных, и хранить его в студентах сбора (т.е. в памяти)? Или он просто поддерживает соединение с этой таблицей, а записи (записи) выполняются во время выполнения SQL в базе данных?

Для следующих:

private StudentContext db = new StudentContext(); 
Student astudent = db.Students.Find(id); 

или

var astudent = from s in db.Students 
       where s.StudentID == id) 
       select s; 

Вопрос: Какой из них лучше для производительности? Я не уверен, как метод Find работает под капотом для коллекции?

Вопрос: Когда соединение с базой данных закрыто? Во время вызова метода Dispose()? Если это так, следует ли вызвать метод Dispose() для класса с экземпляром контекста базы данных? Я читал здесь, чтобы использовать Использование блоков.

Я предполагаю, что для класса Control get get создан, работает, включая доступ к базе данных, вызывает связанный с ним вид, а затем (контроллер) выходит из области действия и выгружается из памяти. Или сборщик гарбаз. Но лучше всего вызывать Dispose(), чтобы выполнить очистку явно.

+0

Исправить меня, если я ошибаюсь, но 'DbSet ' означает, что вы используете Entity Framework, а не LINQ to SQL, не так ли? – MarcinJuraszek

+0

Да, используя EF. Извините, новичок в этих условиях. Я должен был сказать EF и LINQ заявления. –

+0

ОК, я отредактировал ваш вопрос, чтобы соответствовать этому. – MarcinJuraszek

ответ

3

Метод Find выглядит в DbContext для объекта, который имеет указанный ключ (ы). Если уже не загружен совместимый объект, DbContext сделает запрос SELECT TOP 1 для получения объекта.

Запуск db.Students.Where(s => s.StudentID == id) приведет вас к последовательности, содержащей все сущности, возвращаемые из SQL-запроса, похожие на SELECT * FROM Students WHERE StudentID = @id. Это должно быть довольно быстро; вы можете ускорить его, используя db.Students.FirstOrDefault(s => s.StudentID == id), который добавляет TOP 1 в запрос SQL.

Использование Find более эффективно, если вы загружаете один и тот же объект более одного раза из одного и того же DbContext. Помимо этого Find и FirstOrDefault в значительной степени эквивалентны.

В любом случае контекст загружает всю таблицу и не содержит open соединение. Я считаю, что DbContext поддерживает соединение до тех пор, пока DbContext не будет удален, но он открывает и закрывает соединение по требованию, когда ему нужно разрешить запрос.

+0

Да, спасибо. И из http://msdn.microsoft.com/en-us/library/bb896325%28v=vs.100%29.aspx. Entity Framework открывает соединения только тогда, когда это необходимо, например, для выполнения запроса или для вызова SaveChanges и затем завершает соединение, когда операция завершена. Вызов любого из следующих методов открывает соединение: 1. Сохранить изменения или обновить объект ObjectContext. 2. FirstOrDefault или First on ObjectQuery. 3. Загрузите EntityCollection. 4. Загрузите EntityReference. 5.Любой метод запросов на основе языка (LINQ) или метод построения запросов ObjectQuery, например Where, OrderBy или Select. –

+1

Номер 5 в этом списке неверен; соединение определенно открывается только тогда, когда IQueryable * перечисляется *, а не при вызове метода запроса. –

Смежные вопросы