2011-06-20 117 views
2

我正在使用實體框架和自我跟蹤實體使用WPF的個人項目。我有一個WCF Web服務,它爲CRUD操作提供了一些方法。今天我決定做一些測試,看看究竟是通過這項服務傳播的,儘管我期望這樣的事情,但我真的很失望。問題是,對於一個對象的簡單更新(或刪除)操作 - 可以說類別我向服務器發送整個對象圖,包括其所有父類別,其項目,子類別及其項目等。我的情況是一個非常小的數據庫(2個主要類別,大約20個總計和大約60個項目)上的170 KB xml文件。我無法想象如果我有一個非常大的數據庫會發生什麼。自我跟蹤實體流量優化

我試圖谷歌關於與STE流量優化的一些文章,但沒有成功,所以我決定問這裏是否有人做過類似的事情,知道一些好的做法等

一個可能的方法我想出了與更多的服務電話獲得我每個對象所需要的數據:

return context.Categories.ToList();//only the categories 
... 
return context.Items.ToList();//only the items 

相反的:

return context.Categories.Include("Items").ToList(); 

這樣的CATEG ories和項目將被分開,並且在更改或刪除某些對象時,通過線路發送的數據將會更少。

有沒有人遇到類似的問題,您是如何解決這個問題的?或者您是否解決了這個問題?

+0

爲什麼不使用自我跟蹤實體的一個原因。我認爲它有一些開銷,因爲原始值可能通過電線傳輸。 – yonexbat

+0

是的,他們是。我還認爲,就優化和創建嚴重的應用程序而言,使用ADO.NET或其他技術要好得多,因爲您無需發送兆字節數據即可更改單個字母,無論其他好處如何,Entity Framework爲您提供。他們對我來說(可能不僅僅是我)不足以讓我閉上眼睛。 –

回答

1

我們遇到了類似的挑戰。首先,正如你已經提到的那樣,就是讓實體儘可能小(如所期望的客戶端功能所規定的那樣)。其次,將實體發送回線路以便持久化時:剝離所有導航屬性(嵌套對象),當它們沒有更改時。這聽起來很簡單,但並不重要。我們所做的是遞歸地挖掘存在於可追蹤集合中的實體(稱爲「最頂層」實體(及其可追蹤集合,以及它們,......)),並在其ChangeTracking狀態爲「未更改」時將其刪除。但請小心,因爲在某些情況下,您仍然需要這些實體,因爲它們已被刪除或添加到其父實體的可跟蹤集合中(因此您不應刪除它們)。

Julie Lerman's - Programming Entity Framework中也提到了這個,我們稱之爲「StripEntity」(不帶任何代碼示例或任何其他)。

雖然它可能不像更純粹的方法那樣高效,但STE的使用爲針對數據庫的查詢節省了大量代碼。在高流量情況下,我們並不需要優化性能,所以STE適合我們的需求,並帶走了大量的代碼與數據庫進行通信。您必須爲您的情況決定「最佳」解決方案。祝你好運!

+0

這是一個有趣的方法!當我有時間時,我會給它一個鏡頭。謝謝! –

+0

@Ivan:如果你需要一些幫助......也許我可以給你提供一些代碼。 –

1

您可以在http://selftrackingentity.codeplex.com/找到實體框架項目項目。在版本0.9.8中,我添加了一個名爲GetObjectGraphChanges()的方法,該方法返回一個只有對象發生更改的優化實體對象圖。

此外,還有兩個幫手方法:EstimateObjectGraphSize()EstimateObjectGraphChangeSize()。第一種方法返回整個實體對象及其對象圖的估計大小;而後者僅返回最優化實體對象圖的估計大小,其中僅具有變化的對象。有了這兩個輔助方法,您可以決定是否有意義調用GetObjectGraphChanges()