Entity Framework關聯實體的三種加載方法

推薦文章html

EF性能之關聯加載 總結很好數據庫

一:介紹三種加載方式框架

Entity Framework做爲一個優秀的ORM框架,它使得操做數據庫就像操做內存中的數據同樣,可是這種抽象是有性能代價的,故魚和熊掌不能兼得。可是,經過對EF的學習,能夠避免沒必要要的性能損失。本篇只介紹關聯實體的加載的相關知識,這在我以前的文章中都有介紹。

咱們已經瞭解到EF的關聯實體加載有三種方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Loading都是延遲加載。

(一)Lazy Loading使用的是動態代理,默認狀況下,若是POCO類知足如下兩個條件,EF就使用Lazy Loading:

POCO類是Public且不爲Sealed。
導航屬性標記爲Virtual。
關閉Lazy Loading,能夠將LazyLoadingEnabled設爲false,若是導航屬性沒有標記爲virtual,Lazy Loading也是不起做用的。

(二)Eager Loading使用Include方法關聯預先加載的實體。

(三)Explicit Loading使用Entry方法,對於集合使用Collection,單個實體則使用Reference。

2-1:Lazy Loading模式ide

做用性能

/*在讀取父類的時候自動將全部關聯類的實體都加載出來
**好比
*/
        public class Site
        {
            [Key]
            public int Id{ get; set; }
            public string Name { get; set; }

            /*virtual 知識點關鍵字:EF三種關聯加載  Lazy Loading,Eager Loading,Explicit Loading*/
            public virtual ICollection<News> Newss { get; set; }
        }
/*經過db.Site.FirstOrDefault();會加載出一個符合條件的Site實體,而且Site實體下的全部News對象也都**加載出來而且保存在Newss中
*/

使用方法學習

兩步

第一:在須要延遲加載的屬性前加上virtual ,該屬性的類型能夠是任務的集合類型ICOLLOCT<T>或者是0/1..1關聯屬性。

如: public virtual List<Product> Products { get; set; }

第二:在context構造器中開啓延遲加載功能

Configuration.LazyLoadingEnabled = true;    //EF6 以前的版本多是ContextOptions.LazyLoadingEnabled = true;

漲姿式spa

//既支持在Content構造器中一次設置,程序所有通用
//也能夠在程序執行查詢等命令以前動態設置
//好比
            using (var db = new SpriderContent())
            {
                db.Configuration.LazyLoadingEnabled = false
                OrgPlate plate = db.OrgPlates.FirstOrDefault();
            }

2-2:Eager Loading模式代理

做用:code

EF不會再幫你把關聯實體加載出來,而只會把當前表的內容讀取出來,提升效率

使用方法:htm

//同Lazy Loading恰好相反  dConfiguration.LazyLoadingEnabled = false
private static void EagerLoading(EFLoadingContext ctx)
        {
            //發送一條查詢到數據庫庫,查詢全部的province並關聯city和governor
            var list = ctx.Provines.Include(t => t.Cities).Include(t => t.Governor);
            foreach (var province in list)
            {
                //無論ctx.Configuration.LazyLoadingEnabled爲false,仍是沒有標註導航屬性virtual,都不會拋出異常
                Print(province);
            }
        }

//例子來源於http://www.cnblogs.com/nianming/p/3494781.html

2-3:Explicit Loading模式

使用方法

1:Configuration.LazyLoadingEnabled = false;
2:Explicit Loading使用Entry方法,對於集合使用Collection,單個實體則使用Reference。
    void ExplicitLoading(EFLoadingContext ctx)
    {
            //發送一條查詢到數據庫,查詢全部的province
        var list = ctx.Provines.ToList();
        foreach (var province in list)
            {
                var p = ctx.Entry(province);
                //發送一條查詢,查詢全部當前province的city
                p.Collection(t => t.Cities).Load();
            //發送一條查詢,查詢當前province的governor
            p.Reference(t => t.Governor).Load();
            //無論ctx.Configuration.LazyLoadingEnabled爲false,仍是沒有標註導航屬性virtual,都不會拋出異常
            Print(province);
        }
    }
//例子引用自http://www.cnblogs.com/nianming/p/3494781.html
相關文章
相關標籤/搜索