ef三種加載方式

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; }
    }

複製代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章