[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;
積極式載入有幾個方法:
"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