2011-05-10 69 views
2

這是一個通用體系結構問題,希望在那裏已經在最終應用程序中使用EF。N層應用程序上的實體框架自追蹤實體

我們有一個典型的N層應用程序:

  • WPF客戶
  • WCF服務
  • EF STE DTO的
  • EF數據層

應用程序加載所有已知的業務加載時間內的類型(與用戶登錄同時),然後根據需要加載非常大的「工作批次」,該批次大約爲4-8M g,由超過1.000個業務對象組成。當我們完成加載這個「批」後,我們然後鏈接所有與以前加載的業務類型等...

最後我們有大約2K-5K業務對象在內存中都正確引用,所以我們可以使用和濫用LINQ在客戶端,我們也在客戶端的所有這些對象上做了一些複雜的數學計算,所以我們真的需要大圖。

當我們想要將更改保存到數據庫時,就會出現問題。有了這麼大的對象圖,我們幾乎不想再通過網絡發送一切。

鑑於目前T4模板的複雜性,我不喜歡我們目前的看法,即在更新時分離並附加所有內容。我們基本上想要更新給定的對象,將它從圖的其餘部分分離出來,通過網絡發送,在WCF端進行更新,然後在客戶端再次重新附加它。主要的問題是,當你想更新鏈接的對象時,假設你添加了一些對已添加的東西有參考的東西,然後是對已修改的東西的另一個引用等等。這迫使很多客戶端代碼確保我們不會「不會破壞任何東西

所有這些都是通過生成的代碼完成的,因此我們正在討論每個模板200-800行T4代碼。

我現在看到的是一種定製STE的序列化和反序列化的方法,這樣我就可以控制通過網絡發送或不發送的內容,並且可以更新批量而不是僅僅一個STE 。檢查引用,看看這些引用是否不變;如果不是不序列化的話,如果是的話,只需將它附加到WCF端的上下文就可以序列化並更新所有內容。

經過一番研究,我找到了2種解決方法。

一種是通過編寫自定義的DataContractSerializer。

第二個是通過更改由EF創建的STE模板並使用KnownTypeAttribute進行播放,而不是爲每個引用類型生成它,讓它引用檢查該對象的方法,並僅標記不是用於序列化引用的方法不變。

  • 有沒有人遇到過這個 問題?
  • 您使用了哪些解決方案?
  • 你遇到過什麼問題 該行?
  • 維護創建的 模板有多容易?

回答

0

我不知道整個應用程序的設計,但如果你通常將工作批次加載到服務中,然後將它發送給客戶端來使用它,它看起來像服務層是多餘的,你可以直接加載來自數據庫的數據(你會得到更好的性能)。根據計算的複雜性,您也可以直接在數據庫中進行一些計算,並且您將再次獲得更好的性能。

您只保存圖的一部分的方法是濫用STE概念。 STE的工作方式 - 加載圖形,修改圖形並保存同一圖形。如果您想要讀取大數據集並只保存小塊,則最好加載用於讀取的數據集,並且一旦決定更新塊,再次只加載塊,修改並將其發回。

干擾內部STE行爲是imho在某些角落/意外情況下丟失一些更改的最佳方式。

Btw。這在某種程度上看起來像是將本地數據庫與全局數據庫同步的場景 - 我從來沒有這樣做過,但在智能客戶端中卻很常見。

+0

不是真的,因爲這是通過Internet使用的,並且直接暴露SQL Server是不可能的,因此基礎結構規則,DMZ等等都會阻止您這樣做。更不用說有些人會使用這個應用程序在控制網絡內部,並且通常端口80是開放的HTTP,而TCP端口1433到SQL Server多次關閉。 – 2011-05-10 14:42:47

+0

我們不僅可以有大塊的對象圖,因爲一些重數學應用於整個圖,它會更新很多圖。最終的結果就是用戶看到和感知的內容。我們也沒有得到整個數據庫,因爲它包含了幾個這樣的大對象圖,我們只按照用戶的需求一次加載一個。該業務是管理歐洲研發經費的應用程序,因此我們需要加載整個「項目」來完成需要削減的所有數據,實際成本,投資是什麼,可以或不可以,可以實現的是什麼由基金支付等。 – 2011-05-10 14:45:48

+0

好吧,現在使用WCF是有道理的,但仍然想通過WCF與全局數據庫同步本地數據庫(應該可以使用MS Sync框架)聽起來像解決方案的問題少得多。我不認爲STE是你需要的,因爲他們的目的不同。 – 2011-05-10 15:08:18