通過昨天對EF貪婪加載和延遲加載的學習,不難發現,延遲加載還是很好用的,但是問題也就來了,有的時候我們只需要加載一個實體,不需要和他相關的外部實體,這時候我們來看看EF延遲加載時怎麼作用的吧
打開profiler
在Main函數入口處寫一個查詢,在Console.Read();處打一個斷點
static void Main(string[] args) { var context = new EFDbContext(); var user = context.Users.FirstOrDefault(a => a.Id == 1); Console.WriteLine(user.Name); Console.Read(); }
在profiler中最後一行可以看他EF生成sql語句
也就是說我們只需要實體本身的屬性的時候EF不會幫我們加載外部實體
接下來修改一下Main函數中的內容
static void Main(string[] args) { var context = new EFDbContext(); var users = context.Users.FirstOrDefault(a => a.Id == 1); //var users = context.Users.Include("Articles").FirstOrDefault(a => a.Id == 1); Console.WriteLine(users.Name); foreach (var a in users.Articles) { Console.WriteLine(a.Title + "," + a.Category.Name + "\n"); } Console.WriteLine(users.Articles.Count() + "\n" + users.Categories.Count() + "\n"); Console.Read(); }
進行單步調試並觀察profiler發現,延遲加載是在我們需要某一個外部實體時才從數據庫中查找的
換成貪懶加載
結論;
延遲加載是在我們需要的時候才去加載,當需要加載大量的外鍵對象時會增加與數據庫的讀取次數
此時可以考慮貪婪加載