淺談AsNotracking()的作用
我們都知道EF默認(rèn)情況下對數(shù)據(jù)的訪問都是啟用模型跟蹤。
Entity Framework在第一次對象加載到內(nèi)存中時進(jìn)行一次快照,添加快照發(fā)生在返回一次查詢或添加一個對象到DbSet中時。當(dāng)Entity Framework需要知道對象的變動時,將先把當(dāng)前實體與快照中的對象進(jìn)行掃描對比。實現(xiàn)掃描對比的方法是調(diào)用DbContext.ChangeTracker的DetectChanges方法。
變動跟蹤代理:變動跟蹤代理是一種會主動通知Entity Framework實體對象發(fā)生變動的機(jī)制。如:延遲加載的實現(xiàn)方式。要使用變動跟蹤代理,需要在定義的類結(jié)構(gòu)中,Entity Framework可以在運行時從POCO類中創(chuàng)建動態(tài)類型并重寫POCO屬性。動態(tài)代理就是一種動態(tài)類型,包含重寫屬性和通知Entity Framework實體對象變動的邏輯。
大部分的實例對象的變動調(diào)整需要在Entity Framework進(jìn)行SaveChanges時才會知道,但也可以根據(jù)需要調(diào)用變動跟蹤獲取當(dāng)前對象的狀態(tài)。
Entity Framework Code First的DbContext.DetectChanges在檢測實例對象的變動時,大部分情況不會有性能的問題。但當(dāng)有大量的實例對象在內(nèi)存中,或DbContext有大量的操作時,自動的DetectChanges行為可能會一定程度的影響性能。
使用AsNoTracking方法查詢返回?zé)o變動跟蹤的Province的DbSet,由于是無變動跟蹤,所以對返回的Province集中數(shù)據(jù)的任何修改,在SaveChanges()時,都不會提交到數(shù)據(jù)庫中。
使用AsNoTracking()方法注意:
只能用于查詢,不能把查詢后的實體用作其他的用途,不然會導(dǎo)致其他的錯誤。例如:我想查詢數(shù)據(jù)庫有沒有一條數(shù)據(jù),用AsNotracking()查詢后,如果有就把他賦值給一個實體,如果沒有就new一個新實體 。這樣的話,因為AsNotracking()沒有把這個實體加到EF跟蹤里面,EF就會認(rèn)為這個實體在數(shù)據(jù)庫不存在,就會把查詢后的實體添加到數(shù)據(jù)庫,但是實際情況是這個實體是存在于數(shù)據(jù)庫里面的,這樣就會報數(shù)據(jù)重復(fù)的錯誤。所以使用AsNotracking()只能用于查詢,不能用于其他賦值的操作。
————————————————
版權(quán)聲明:本文為CSDN博主「@云淡風(fēng)輕~」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/chengmin1989/article/details/88941525

浙公網(wǎng)安備 33010602011771號