簡體   English   中英

什么時候禁用代理生成並使用AsNoTracking?

[英]When to disable proxy generation and use AsNoTracking?

在我的WebApi項目中,我使用EF6,遵循Uow和通用存儲庫模式,我還將模型映射到dto,反之亦然。

當前,我在創建dbContext時設置以下dbContext

this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;

從數據庫中獲取數據時,我也使用AsNoTracking

更新數據庫時,我在處理小實體時(即沒有關系)直接使用dbContext附加實體。 我將GraphDiff用於復雜實體(即有關系)。

在啟用代理和跟蹤時,甚至禁用它們時,我注意到發送到數據庫的SQL語句包括所有表的列,而不是僅包含已實際更改的列。

但是,GraphDiff在將更改保存到數據庫之前再次加載實體。 在這種情況下,SQL語句也包含所有列。 這是正確的行為嗎?

因此,在我的情況下,在處理分離的實體時禁用代理和跟蹤是否安全?

是的,我想是的; 這是EF處理樂觀並發的一種方式。

樂觀並發涉及樂觀地嘗試將您的實體保存到數據庫,以期自從加載實體以來那里的數據沒有改變。 如果事實證明數據已更改,則將引發異常,並且必須先解決沖突,然后再嘗試保存。

EF進行此檢查的唯一方法是加載所有列,檢查是否有任何更改,如果在上次加載與保存之間記錄被修改,則阻止保存。 檢查一下

如果沒有時間戳列,則可以使用此屬性( 此處有更多信息) [ConcurrencyCheck]通知EF該特定列是用於了解記錄是否已更改的列。 這應該避免加載所有進行並發檢查。

希望能幫助到你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM