[C#.NET][Entity Framework] 關聯式查詢與消極式載入Lazy Loading

[C#.NET][Entity Framework] 關聯式查詢與消極式載入Lazy Loading

ORM 的關鍵技術之一,消極式載入(Lazy Loading),這也是EF預設的行為:

當我們利用 EF 查詢某一張資料表的時候,EF 不會『立即』把從 SQL 把關聯資料載入,待需要使用關聯資料時,才會自動再從 SQL 那裡把資料讀回來;反之,查詢時一併讀取關聯式資料,稱為積極式載入,不論是什麼樣的載入方式,AP 到 SQL 的資料交換都需要網路消費,程式設計師需要瞭解什麼時間點需要用到什麼資料,然後選擇較好的載入方式,以下提供幾點選擇時機參考:

  • 當網路有問題,可選擇積極式載入,可減少網路往返
  • 但如果載入太多實體,回傳的封包就會越大,這時可切換到消極式載入
  • 不確定現階段會使用哪些關聯,選擇消極式載入,可避免一次載入太多實體,程式碼也會比較容易閱讀;若確定則使用積極式載入,但別一次載入太多資料

POCO Proxy 的定義請參考上篇 http://www.dotblogs.com.tw/yc421206/archive/2014/04/16/144762.aspx

 

關閉消極式載入(Lazy Loading),取消自動載入關聯資料,當需要使用關聯資料時,必須使用積極式載入

context.Configuration.LazyLoadingEnabled = false;

 

積極式載入有幾個方法:

DbQuery<TResult>.Include

"Orders" 為關聯表的名稱



  

 

指定欄位也可以

 

或者,搭配DbSet<TEntity>.Load

把關聯資料表先載入,再進行查詢

var find = context.Products.FirstOrDefault(o => o.Id == 1);

參考文章:

http://msdn.microsoft.com/library/bb896272.aspx

http://msdn.microsoft.com/zh-tw/data/hh949853.aspx


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/04/18/144784.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo