EntityFramework(EF)贪婪加载和延迟加载的选择和使用
貪婪加載:顧名思議就是把所有要加載的東西一 次性讀取
1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Orders.Include("OrderDetails") select o; 4 }當(dāng)讀取訂單信息orders的時(shí)候,我們希望把訂單的詳細(xì)信息也讀取出來(lái),那么這里我們使用Include關(guān)鍵字將關(guān)聯(lián)表也加載進(jìn) 來(lái)。
?
延遲加載:即當(dāng)我們需要用到的時(shí)候才進(jìn)行加載(讀取)
當(dāng)我們希望瀏覽某條訂單信息的時(shí)候,才顯示其對(duì)應(yīng)的訂單詳細(xì)記錄時(shí),我們希望使用延遲加載來(lái)實(shí)現(xiàn),這樣不僅加快的了 讀取的效率,同時(shí)也避免加載不需要的數(shù)據(jù)。延遲加載通常用于foreach循環(huán)讀取數(shù)據(jù)時(shí)。
那么我們?cè)诙xModel的時(shí)候,需要在屬性前面添加virtual關(guān)鍵字。如下
1 public class Order 2 { 3 public int OrderID { get; set; } 4 public string OrderTitle { get; set; } 5 public string CustomerName { get; set; } 6 public DateTime TransactionDate { get; set; } 7 public virtual List<OrderDetail> OrderDetails { get; set; } 8 }?
如果我們想要禁止使用延遲加載,那么最好的方法是在DbContext類的構(gòu)造方法中聲明
1 public class MyDbContext:DbContext 2 { 3 public MyDbContext() 4 { 5 this.Configuration.LazyLoadingEnabled = false; 6 } 7 }?
?
總結(jié):
貪婪加載:
1、減少數(shù)據(jù)訪問(wèn)的延遲,在一次數(shù)據(jù)庫(kù)的訪問(wèn)中返回所有的數(shù)據(jù)。
2、一次性讀取所有相關(guān)的數(shù)據(jù),可能導(dǎo)致部分?jǐn)?shù)據(jù)實(shí)際無(wú)需用到,從而導(dǎo)致讀取數(shù)據(jù)的速度變慢,效率變低
延遲加載:
1、只在需要讀取關(guān)聯(lián)數(shù)據(jù)的時(shí)候才進(jìn)行加載
2、可能因?yàn)閿?shù)據(jù)訪問(wèn)的延遲而降低性能,因?yàn)檠h(huán)中,每一條數(shù)據(jù)都會(huì)訪問(wèn)一次數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)的壓力加大
綜上所述,我們應(yīng)該比較清楚時(shí)候應(yīng)該使用哪種機(jī)制?我個(gè)人的建議是:
1、如果是在foreach循環(huán)中加載數(shù)據(jù),那么使用延遲加載會(huì)比較好, 因?yàn)椴恍枰淮涡詫⑺袛?shù)據(jù)讀取出來(lái),這樣雖然有可能會(huì)造成n次數(shù)據(jù)庫(kù)的查詢,但 是基本上在可以接受的范圍內(nèi)。
2、如果在開(kāi)發(fā)時(shí)就可以預(yù)見(jiàn)需要一次性加載所有的數(shù)據(jù),包含關(guān)聯(lián)表的所有數(shù)據(jù), 那么使用使用貪婪加載是比較好的選擇,但是此種方式會(huì)導(dǎo)致效率問(wèn)題,特別是數(shù)據(jù)量大的情況下。
轉(zhuǎn)載于:https://www.cnblogs.com/dongh/p/7086260.html
總結(jié)
以上是生活随笔為你收集整理的EntityFramework(EF)贪婪加载和延迟加载的选择和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 类与类集合的基本使用
- 下一篇: bzoj1059: [ZJOI2007]