2016-01-06 1 views
18

Я прочитал это tutorial и этот article, но я не понимаю, как именно использовать каждый тип загрузки.Eager, Lazy и явная загрузка в EF6

Объясняет

У меня есть этот ПОКО:

public partial class dpc_gestion 
{ 
    public dpc_gestion() 
    { 
     this.ass_reunion_participant = new HashSet<ass_reunion_participant>(); 
     this.dpc_participant = new HashSet<dpc_participant>(); 
     this.dpc_reunion = new HashSet<dpc_reunion>(); 
    } 

    public int dpc_id_pk { get; set; } 
    public Nullable<int> dpc_id_gdp_fk { get; set; } 
    public Nullable<int> dpc_id_theme { get; set; } 
    public int dpc_id_animateur_fk { get; set; } 
    public Nullable<System.DateTime> dpc_date_creation { get; set; } 
    public Nullable<System.DateTime> dpc_date_fin { get; set; } 
    public Nullable<System.DateTime> dpc_date_engag_anim { get; set; } 
    public Nullable<bool> dpc_flg_let_engag_anim { get; set; } 
    public Nullable<bool> dpc_flg_fsoins_anim { get; set; } 
    public virtual ICollection<ass_reunion_participant> ass_reunion_participant { get; set; } 
    public virtual theme_dpc theme_dpc { get; set; } 
    public virtual gdp_groupe_de_pair gdp_groupe_de_pair { get; set; } 
    public virtual ICollection<dpc_participant> dpc_participant { get; set; } 
    public virtual ICollection<dpc_reunion> dpc_reunion { get; set; } 
} 

Я понял это:

  1. для ленивой загрузки: потому что нагрузка ленива, если я позвоню dbset dpc_gestion все навигационные свойства не будет. Этот тип загрузки является лучшим в производительности и быстроте. Она включена по умолчанию, и если я хотел бы включить его я должен установить:

    context.Configuration.ProxyCreationEnabled = true;  
    context.Configuration.LazyLoadingEnabled = true; 
    
  2. Для жадной загрузки Это не лень: он грузится все навигационные свойства, когда я загружаю dpc_gestion , Свойства навигации можно загрузить с использованием метода include. Чтобы включить этот тип загрузки:

    context.Configuration.LazyLoadingEnabled = false; 
    
  3. Для явной загрузки Это как нетерпеливые нагрузки, но мы используем Load метод вместо include.

Так что я хотел бы знать:

  1. Если это небольшое резюме верно?
  2. Если это правда, в чем разница между энергичной и явной загрузкой?
  3. Если я использую ленивая загрузка, и я звоню, например, dpc_gestion.dpc_participant, загружаются ли свойства навигации? Или я получу исключение?
  4. Есть ли случай, когда интенсивная загрузка или явная загрузка были лучше, чем ленивая загрузка в производительности и отзывчивости?

Благодаря

ответ

14

Если это небольшое резюме верно?

Да.

Если это правда, в чем разница между энергичной и явной загрузкой?

жадная загрузка противоположна Ленивая загрузка но Явная загрузка аналогична отложенной загрузки, за исключением того, что: вы явно получить соответствующие данные в коде; это не происходит автоматически при доступе к навигационному свойству. Вы загружаете связанные данные вручную, получая запись менеджера состояния объекта для объекта и вызывая метод Collection.Load для коллекций или метод Reference.Load для свойств, содержащих один объект.

От techblog:

Нетерпеливый Загрузка:

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

Явная Загрузка:

Явная нагрузка определяется следующим образом: когда объекты возвращаются запросом, связанные объекты не загружаются в то же самое время. По умолчанию они не загружены, пока явно не запрошены с использованием метода Load на свойства навигации .

И:

Если я использовать отложенную загрузку, и я призываю к примеру dpc_gestion.dpc_participant, делает навигацию свойств нагрузки, или я получаю исключение?

Вы не получите никаких исключений, и навигационные свойства должны загружаться.

Есть ли случай, когда ожидаемая загрузка или явная загрузка были лучше , чем ленивая загрузка в производительности и отзывчивости?

жадная загрузка обычно более эффективна, когда вам нужна соответствующие данные для всех извлекаемых строк главной таблицы. А также, когда отношений не слишком много, нетерпеливая загрузка будет хорошей практикой, чтобы уменьшить дальнейшие запросы на сервере. Но когда вы знаете, что вам не понадобится недвижимость мгновенно, тогда ленивая загрузка может быть хорошим выбором. А также желаемая загрузка - это хороший выбор в ситуации, когда ваш контекст db будет удален, а ленивая загрузка больше не может быть. Например, рассмотрим следующее:

public List<Auction> GetAuctions() 
{ 
    using (DataContext db = new DataContext()) 
    { 
     return db.Auctions.ToList(); 
    } 
} 

После вызова этого метода, вы не можете загрузить связанный объект лениво, потому что db расположена и поэтому жадная загрузка будет лучшим выбором здесь. более

Одна вещь, чтобы отметить: Ленивая загрузка будет производить несколько запрос SQL, а жадная загрузка нагрузки данных с одного запроса. Eager loading также является хорошим выбором для решения проблемы n + 1 выбирает проблему в ORM. Посмотрите на это сообщение: What is the n+1 selects issue?

+1

@LamloumiAfif ... Еще одна вещь, которую следует отметить: Lazy loading приведет к нескольким запросам SQL, в то время как Eager загружает данные загрузки одним запросом. –

+0

Кроме того, установка 'LazyLoadingEnabled = false' не активирует загрузку. Это отключает ленивую загрузку. Можно загружать загрузку с помощью 'Include', когда включена ленивая загрузка – Colin

5

Вопрос 1 и 2:

Ваше объяснение отложенной загрузки и нетерпеливого загрузка правильно.
Использование Явная загрузка немного отличается от описанной.

EntityFramework возвращает IQueryable объекты, которые по существу содержат запрос к базе данных. Но они не выполняются до тех пор, пока они не будут перечислены.
Load выполняет запрос, чтобы его результаты сохранялись локально.
Вызов Load - это то же самое, что и звонок ToList и выбрасывание List, без накладных расходов на создание List.

Вопрос 3:

При использовании отложенной загрузки, EntityFramework позаботится о загрузке навигации свойства для вас, так что вы не получите исключение.
Имейте в виду, что это может занять некоторое время и сделать вам заявление не отвечает.

Вопрос 4:

В отключенных случаях (например, приложение сети) не может использование отложенной загрузки, потому что эти объекты переводятся в DTOS, а затем не отслеживаются EntityFramework.

Кроме того, если вы знаете, что вы собираетесь использовать свойство навигации, хорошая практика, чтобы загрузить его нетерпеливо, так что вам не придется ждать, пока они не будут загружены из базы данных.
Например, скажем, вы сохраняете результат в списке и привязываете его к WPF DataGrid. Если DataGrid обращается к еще не загруженному ресурсу, пользователь испытывает заметный тайм-аут, пока не отобразится это свойство. Кроме того, приложение не будет отвечать во время загрузки (если вы не загружаете асинхронно).

+2

Также имейте в виду, что для ленивой загрузки контекст должен быть живым, иначе будет выбрано исключение. И я бы сказал, что в отключенных сценариях вы * можете * использовать ленивую загрузку до тех пор, пока вы строите граф объектов, который будет сериализован, хотя чаще всего загружается все, что вам нужно явно, либо 'Include', либо' Load '. –

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

  • Нет связанных вопросов^_^