2012-01-26 12 views
1

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

ответ

3

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

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

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

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

2

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

1

Нет, 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. Перечислите объект. Aka, предложите провайдеру запроса контекста «заставьте меня все деметировать» (предположим sql) «выберите * из MyEntity с (nolock);» и запустите запрос, возвращающий ADO.NET SqlDataReader, который будет читать первую строку, сопоставьте объект в (необязательно) ленивый объект с некоторыми метаданными, поэтому EF знает, к какой строке он привязан, и т. д., и yeild, который является переменной «entity».
  4. Сделайте что-нибудь с сущностью, которую вы волшебным образом получили от базы данных, фактически не выполнив никакой реальной работы (спасибо Entity Framework!)
  5. Попросите EF переместить SqlDataReader в следующую строку и предоставить другую сущность (ака, вернитесь к шагу 3, но только если существует другая строка)
  6. Закройте соединение с базой данных.
Смежные вопросы