[EntityFramework] DbContext快取測試

  針對DbContext在資料存取的內建快取機制作測試記錄。本文案例以建立一個DbContext為主來執行CRUD,可能會遇到的問題。


例1:直接以SQL更新或資料庫手動更新後,再查Entity的資料還是舊的

以下的程式在以SQL更新資料庫前,就先查詢該筆Entity。而預設的快取機制並不知道你的資料已異動,就算你再執行一次查詢,資料回來還是會是舊的 (更神奇的是用SQL Profiler看,是有執行SQL,只是未填入Entity)。

image
解決方法:使用AsNoTracking

以上面的程式修改成在第二次查詢時,使用AsNoTracking來直接查資料庫的資料而不使用DbConext的快取

image


例2:以上面的解決方法,那每次查資料時是不是都可以使用AsNoTracking?

答案是看你用在什麼情況,若你使用了AsNoTracking,而對該Entity修改了資料,然後執行SaveChange(),是無法更新資料庫的,因為DbContext在AsNoTracking的查詢下並未快取該資料原本的狀態,所以無法依異動的資料來作更新。

image


Summary

針對上述的狀況,在使用上可以分為如下
1.若只是單純查詢資料,使用AsNoTracking,在效能上也比較快
2.若異動是透過SaveChange則不使用AsNoTracking。
3.若異動是透過SQL或預存程序,則執行前的查詢資料,使用AsNoTracking

這個網誌中的熱門文章

IIS 設定只允許特定IP進入

[Sql Server] 資料庫備份筆記