1. 程式人生 > >EntityFramework(EF)貪婪加載和延遲加載的選擇和使用

EntityFramework(EF)貪婪加載和延遲加載的選擇和使用

this 可能 基本上 ring etime 代碼 數據 需要 loading

貪婪加載:顧名思議就是把所有要加載的東西一 次性讀取

1 using (var context = new MyDbContext()) 
2 { 
3     var orders = from o in context.Orders.Include("OrderDetails") select o;
4 }

當讀取訂單信息orders的時候,我們希望把訂單的詳細信息也讀取出來,那麽這裏我們使用Include關鍵字將關聯表也加載進 來。

延遲加載:即當我們需要用到的時候才進行加載(讀取)

當我們希望瀏覽某條訂單信息的時候,才顯示其對應的訂單詳細記錄時,我們希望使用延遲加載來實現,這樣不僅加快的了 讀取的效率,同時也避免加載不需要的數據。延遲加載通常用於foreach循環讀取數據時。

那麽我們在定義Model的時候,需要在屬性前面添加virtual關鍵字。如下

技術分享
1 public class Order 
2 { 
3     public int OrderID { get; set; } 
4     public string OrderTitle { get; set; } 
5     public string CustomerName { get; set; } 
6     public DateTime TransactionDate { get; set; } 
7     public virtual List<OrderDetail> OrderDetails { get; set; } 
8 } 
技術分享

如果我們想要禁止使用延遲加載,那麽最好的方法是在DbContext類的構造方法中聲明

技術分享
1 public class MyDbContext:DbContext
2 {
3     public MyDbContext() 
4     { 
5         this.Configuration.LazyLoadingEnabled = false; 
6     } 
7 }
技術分享

總結:

貪婪加載:
1、減少數據訪問的延遲,在一次數據庫的訪問中返回所有的數據。
2、一次性讀取所有相關的數據,可能導致部分數據實際無需用到,從而導致讀取數據的速度變慢,效率變低


延遲加載:
1、只在需要讀取關聯數據的時候才進行加載
2、可能因為數據訪問的延遲而降低性能,因為循環中,每一條數據都會訪問一次數據庫,導致數據庫的壓力加大

綜上所述,我們應該比較清楚時候應該使用哪種機制?我個人的建議是:

1、如果是在foreach循環中加載數據,那麽使用延遲加載會比較好, 因為不需要一次性將所有數據讀取出來,這樣雖然有可能會造成n次數據庫的查詢,但 是基本上在可以接受的範圍內。

2、如果在開發時就可以預見需要一次性加載所有的數據,包含關聯表的所有數據, 那麽使用使用貪婪加載是比較好的選擇,但是此種方式會導致效率問題,特別是數據量大的情況下。

EntityFramework(EF)貪婪加載和延遲加載的選擇和使用