Инстанцирует ли DbContext From EF всю базу данных? - PullRequest
1 голос
/ 27 января 2012

При создании экземпляра DbContext EntityFramework в MVC3 вся база данных читается?При отладке можно получить доступ ко всем данным во всей базе данных, взглянув на созданный экземпляр DbContext, поэтому не означает ли это, что все данные будут получены при первом соединении?

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Нет, определенно нет. Данные загружаются при доступе к свойствам DbSet / ObjectSet вашего DbContext.

Только данные, которые вы запрашиваете, загружаются из БД и сопоставляются с объектами. Например, когда вы запрашиваете как

DbContext.Table.Where(row => row.Prop1 == "Value")

Он переведен в SQL, оценен в базе данных, и в приложение возвращаются только те строки, которые соответствуют вашему запросу.

2 голосов
/ 27 января 2012

Нет, вся база данных не читается при создании экземпляра.Коллекции сущностей (DbSet <>) в вашем DbContext оцениваются лениво.Поэтому, когда вы отлаживаете и переходите к нему, он запрашивается тогда, а не при создании экземпляра DbContext.

1 голос
/ 27 января 2012

Нет, Entity Framework пытается запрашивать базу данных только тогда, когда вам нужна информация, или вам нужно изменить информацию.

Следующий пример - моя личная интерпретация того, что, как мне кажется, EF делает за сценой. Это, вероятно, несколько неточно, но служит иллюстрацией.

using(var db = new MyDbContext()) // 1
{
    var entities = db.MyEntities; // 2

    foreach(var entity in entities) // 3
    {
        // 4
    } // 5
} // 6
  1. Установить соединение с базой данных
  2. Получите некоторый объект, представляющий запрос, который говорит: «Получить мне все сущности дем».
  3. Перечислить объект. Ака, пусть провайдер запросов контекста переводит «get me all demiteites» в (предполагая sql) «select * from MyEntity with (nolock);» и запускает запрос, возвращающий ADO.NET SqlDataReader, который будет читать первую строку, отобразить объект в (необязательно) ленивый объект с некоторыми метаданными, чтобы EF знал, с какой строкой он сопоставлен и т. д., и вывел его как переменную «entity».
  4. Сделайте что-нибудь с сущностью, которую вы волшебным образом получили из базы данных, фактически не выполняя никакой реальной работы (спасибо Entity Framework!)
  5. Попросить EF переместить SqlDataReader в следующую строку и выдать другую сущность (иначе, вернуться к шагу 3, но только если существует другая строка)
  6. Закрыть соединение с базой данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...