1. 程式人生 > >EF的三種數據加載方式

EF的三種數據加載方式

blog som cit tex 關聯 cati time 方式 south

EF的關聯實體加載有三種方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy LoadingExplicit Loading都是延遲加載。

(一)延遲加載(默認):Lazy Loading使用的是動態代理,默認情況下,如果POCO類滿足以下兩個條件,EF就使用Lazy Loading:

  1. POCO類是Public且不為Sealed。
  2. 導航屬性標記為Virtual。

  關閉Lazy Loading,可以將LazyLoadingEnabled設為false,如果導航屬性沒有標記為virtual,Lazy Loading也是不起作用的。

(二)貪婪加載:不設置導航屬性為virtual,並且對導航屬性使用Include,Eager Loading使用Include方法關聯預先加載的實體。

(三)顯示加載:不設置導航屬性為virtual,並且對導航屬性使用Reference(單個對象).Load()或Collection(對象集).Load()。Explicit Loading使用Entry方法,對於集合使用Collection,單個實體則使用Reference。

 public class Programm
    {
        public static void Main()
        {
            TestDbContext db 
= new TestDbContext(); //延遲加載 var res1 = db.Reservations; foreach (var item in res1) { //do something } //貪婪加載 //有多個Include會全部完成加載,生成的sql命令是一條完成的 var res2 = db.Reservations.Include(r => r.Details);
//顯示加載 var res3 = db.Reservations.ToList(); foreach (var item in res3) { var temp = db.Entry(item); temp.Collection(i => i.Details).Load(); temp.Reference(i => i.Customer).Load(); } } } public class Reservation { public int ReservationId { get; set; } public string ClientName { get; set; } public string Location { get; set; } public List<ReservationDetails> Details { get; set; } public Customer Customer { get; set; } } public class ReservationDetails { public int Id { get; set; } public DateTime Time { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } } public class TestDbContext : DbContext { public DbSet<Reservation> Reservations { get; set; } }

暫時COPY記錄,有空再整理

原文:

http://www.cnblogs.com/peaceSouth/p/5813646.html

https://www.cnblogs.com/liangxiaofeng/p/5809301.html

http://www.cnblogs.com/nianming/archive/2013/01/09/2846952.html

EF的三種數據加載方式