[EntityFramework] DbContext快取測試
例1:直接以SQL更新或資料庫手動更新後,再查Entity的資料還是舊的
以下的程式在以SQL更新資料庫前,就先查詢該筆Entity。而預設的快取機制並不知道你的資料已異動,就算你再執行一次查詢,資料回來還是會是舊的 (更神奇的是用SQL Profiler看,是有執行SQL,只是未填入Entity)。解決方法:使用AsNoTracking
例2:以上面的解決方法,那每次查資料時是不是都可以使用AsNoTracking?
答案是看你用在什麼情況,若你使用了AsNoTracking,而對該Entity修改了資料,然後執行SaveChange(),是無法更新資料庫的,因為DbContext在AsNoTracking的查詢下並未快取該資料原本的狀態,所以無法依異動的資料來作更新。Summary
針對上述的狀況,在使用上可以分為如下1.若只是單純查詢資料,使用AsNoTracking,在效能上也比較快。
2.若異動是透過SaveChange則不使用AsNoTracking。
3.若異動是透過SQL或預存程序,則執行前的查詢資料,使用AsNoTracking。