2011-05-12 71 views
31

我正在將應用程序從EF1升級到EF4.1 我使用「ADO.NET DbContext Generator」模板創建了一個DbContext和一組POCO。DbContext ChangeTracking殺死性能?

當我查詢生成的DbContext時,查詢的數據庫部分需要4ms才能執行(使用EF Profiler進行驗證)。然後在將結果返回給應用程序之前,需要大約40秒的時間(用詞:FORTY!)來完成它所做的任何事情。

EF1在少於2秒內處理相同的查詢。

關閉AutoDetectChanges,LazyLoading和ProxyGeneration贏得我2-3秒。

當我使用AsNoTracking()擴展方法時,我能夠將總執行時間減少到大約3秒。

這表明ChangeTracking是罪魁禍首。

但ChangeTracking是我所需要的。我必須能夠最終堅持所有的改變,而不必親自挑選哪些實體被修改。

任何想法如何解決性能問題?

+1

在這裏討論了幾次。它看起來像EFv4.1中的一個錯誤 – 2011-05-12 07:46:35

+0

當我使用EF4.0和「ADO.NET POCO實體生成器」模板時,情況更糟糕。然後它需要超過80秒,直到我有一些結果。所以這個錯誤在以前的版本中變得更加嚴重,MS無法在EF4.1中正確地修復它? – 2011-05-12 08:05:30

+3

您可以嘗試關閉'AutoDetectChanges' /使用'AsNoTracking',但同時創建跟蹤代理(所有屬性都必須是虛擬的)。我想知道這個曲目是否會改變,現在我無法對它進行測試。 – 2011-05-12 08:12:59

回答

1

documentation末尾的技術是否有用?另外,我避免了許多使用流暢接口來聲明性地聲明給定事務中的哪些實體肯定不會改變而可能改變(不可變或不可改變)的許多性能缺陷。例如,如果我保存的實體是根或其實體引用「refdata」項的聚合根,那麼這種啓發式防止許多寫入,因爲不需要跟蹤不可變項。這些可變項目都會在沒有檢查的情況下被寫入(一個弱點......一個可能或者可能不被接受)。

我正在使用這與一個通用的存儲庫模式,因爲我不想跟蹤更改或實現每個案件的特定策略。如果這還不夠,可能會在上下文之外滾動自己的更改跟蹤,並根據需要添加實體。

+1

鏈接已損壞 – 2012-11-13 19:09:27