通過昨天對EF貪婪載入和延遲載入的學習,不難發現,延遲載入還是很好用的,但是問題也就來了,有的時候我們只需要載入一個實體,不需要和他相關的外部實體,這時候我們來看看EF延遲載入時怎麼作用的吧 打開profiler 在Main函數入口處寫一個查詢,在Console.Read();處打一個斷點 在pro ...
通過昨天對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發現,延遲載入是在我們需要某一個外部實體時才從資料庫中查找的
換成貪懶載入
結論;
延遲載入是在我們需要的時候才去載入,當需要載入大量的外鍵對象時會增加與資料庫的讀取次數
此時可以考慮貪婪載入