2018年8月18日 星期六

Entity Framework Reload&Local

DbSet<Entity>.Local與DbContext的DbEntityEntry(有存放當前值與原始值)皆為EF的快取機制,只要透過EF送出查詢或是更新則會將結果存放在追蹤快取

如以下Code

context.Products.Load();
context.Products.Local.Count

再來介紹一下Reload,當先透過EF撈取一筆資料

var product = context.Products.Find(1);

然後去更新Database這筆資料的值,再以相同語法取得product是不會被更新的,原因是這筆資料是由追蹤快取取得的,需要透過Reload,來更新這筆資料

如以下Code

context.Entry(product).Reload();

總結:
一.
在不當使用EF的情況下,容易造成重複查詢而衍生效能問題,如要避免此情況發生可以透過Local來減少查詢的動作

二.
而要確保資料是否最新,可使用Reload來更新,不然不是透過EF動作的而是Database更新時,則相同的查詢就會是由追蹤快取取得