1. 程式人生 > >EF中的預先加載和延遲加載

EF中的預先加載和延遲加載

category lazy job lazy load AS ger esc csv AR

延遲加載(Lazy Loading)當實體第一次被讀取時,相關數據不會被獲取只會讀取本身。延遲加載數據不會一次性查出來,而是一條一條的查詢,這樣就會多次請求數據庫進行查詢

預先加載<Eager Loading>:預先加載會把所有的數據一次性從數據庫中讀取出來,預先加載就是從數據庫中一次性查詢所有數據,存放到內存中。

寫個例子:一般我是這麽處理的

1、在數據庫上下文中禁用延遲加載

  public DBaseContext() : base("MHaloDBaseContext")
   {
        this.Configuration.LazyLoadingEnabled = false
; }

因為上下文是默認延遲加載的,這樣做的結果是所有的默認為預先加載。

2、下面定義一個類,說明一下

 public class Recruit : EntityBase
 {
     public Recruit()
      {
            IsShow = true;
      }
      public string Name { get; set; }

      public string Describe { get; set; }

      public int OrderId { get; set; }
     
      public
bool IsShow { get; set; } public int JobCategoryId { get; set; } public virtual JobCategory JobCategory { get; set; } }

在查詢Recruit 這個類的時候不會加載關聯類JobCategory 的相關數據,因為我們用了virtual 關鍵字,只有顯式調用時才會加載,如果去掉virtual 關鍵字,關聯類JobCategory 的相關數據就會被加載。

3、如果需要關聯表數據則用Include()

var
list = recSvc.Res.Table() .Pager(filter, o => o.OrderByDescending(s => s.Id), out total, query.page, query.rows).Include(s => s.JobCategory).ToList();

查詢的時候用.Include(s => s.JobCategory)就可以把相關數據查詢出來。

EF中的預先加載和延遲加載