AsNotracking()

我們都知道EF默認情況下對數據的訪問都是啓用模型跟蹤。

Entity Framework在第一次對象加載到內存中時進行一次快照,添加快照發生在返回一次查詢或添加一個對象到DbSet中時。當Entity Framework需要知道對象的變動時,將先把當前實體與快照中的對象進行掃描對比。實現掃描對比的方法是調用DbContext.ChangeTracker的DetectChanges方法。

變動跟蹤代理:變動跟蹤代理是一種會主動通知Entity Framework實體對象發生變動的機制。如:延遲加載的實現方式。要使用變動跟蹤代理,需要在定義的類結構中,Entity Framework可以在運行時從POCO類中創建動態類型並重寫POCO屬性。動態代理就是一種動態類型,包含重寫屬性和通知Entity Framework實體對象變動的邏輯。

     大部分的實例對象的變動調整需要在Entity Framework進行SaveChanges時纔會知道,但也可以根據需要調用變動跟蹤獲取當前對象的狀態。

Entity Framework Code First的DbContext.DetectChanges在檢測實例對象的變動時,大部分情況不會有性能的問題。但當有大量的實例對象在內存中,或DbContext有大量的操作時,自動的DetectChanges行爲可能會一定程度的影響性能。

    使用AsNoTracking方法查詢返回無變動跟蹤的Province的DbSet,由於是無變動跟蹤,所以對返回的Province集中數據的任何修改,在SaveChanges()時,都不會提交到數據庫中。

!!! 使用AsNoTracking()方法注意:

只能用於查詢,不能把查詢後的實體用作其他的用途,不然會導致其他的錯誤。例如:我想查詢數據庫有沒有一條數據,用AsNotracking()查詢後,如果有就把他賦值給一個實體,如果沒有就new一個新實體 。這樣的話,因爲AsNotracking()沒有把這個實體加到EF跟蹤裏面,EF就會認爲這個實體在數據庫不存在,就會把查詢後的實體添加到數據庫,但是實際情況是這個實體是存在於數據庫裏面的,這樣就會報數據重複的錯誤。所以使用AsNotracking()只能用於查詢,不能用於其他賦值的操作。

原文鏈接:https://blog.csdn.net/chengmin1989/article/details/88941525

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章