在使用Entity Framework做查詢的時候,如果只需要顯示,而不用保存實體,那么可以用AsNoTracking()來獲取數據。
這樣可以提高查詢的性能。
代碼如下:
var context = new Entities(connectStr);var contentlist = context.Set<Content>().AsQueryable().AsNoTracking();
但是如果取到數據后,要對數據做修改并保存,則無法反映到數據庫里。
如:
var context = new Entities(connectStr);var contentlist = context.Set<Content>().AsQueryable().AsNoTracking();var content = contentlist.Where(o => o.Id == 18).FirstOrDefault();content.Id = 19;context.SaveChanges();
雖然修改后對數據庫進行了Commit,再次讀取后發現這條數據的Id還是18。
另外如果對通過AsNoTracking得到的數據做刪除處理,則會報錯。
如:
var context = new Entities(connectStr);var contentlist = context.Set<Content>().AsQueryable().AsNoTracking();var content = contentlist.Where(o => o.Id == 18).FirstOrDefault();context.Set<Content>().Remove(content);context.SaveChanges();
執行后會拋出System.InvalidOperationException異常,
原因是:オブジェクトは ObjectStateManager 內に見つからなかったため削除できません。
中文意思是:因為無法在ObjectStateManager中找到對象,所以無法刪除。
新聞熱點
疑難解答