推薦文章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