10

我正在使用標準的「EntityID,ParentID」方法建模的sql server中的大型分層數據集。整棵樹中約有25,000個節點。如何使用實體框架與分層數據?

我經常需要訪問樹的子樹,然後訪問掛起子樹節點的相關數據。基於表值函數,我在幾年前構建了一個數據訪問層,使用遞歸查詢來獲取任意子樹,給定子樹的根節點。

我在想使用實體框架,但我看不到如何查詢分層數據如 this。 AFAIK在Linq中沒有遞歸查詢,我不能在我的實體數據模型中公開TVF。

是繼續使用存儲過程的唯一解決方案嗎?有沒有人解決了這個問題?

說明:樹中的25,000個節點我指的是分層數據集的大小,而不是涉及對象或實體框架的任何事情。

回答

6

可能最好使用名爲「嵌套集」的模式,它允許您在一個查詢中獲取任意子樹。如果節點不經常操作,這特別有用:Managing hierarchical data in MySQL

在完美的世界中,實體框架將提供使用此數據模式保存和查詢數據的可能性。

+0

鏈接不幸現在已經死亡 – Oskar 2011-09-19 09:59:07

+0

@Oskar:該頁面現已在其作者網站上提供,我更新了鏈接。 – 2011-10-23 14:47:03

0

一切都可能與實體框架,但你必須破解和削減你的方式。我目前使用的數據庫有太多的「持有者表」,因爲例如與團隊和用戶共享點數。用戶和團隊都可以擁有博客。

當你說25000個節點你的意思是導航屬性?如果是這樣的話,我認爲將數據訪問到位可能會非常棘手。使用實體框架來導航,搜索等並不困難,但我傾向於在紙上建模,然後根據我在使用實體框架時如何導航來創建數據庫。聽起來像你沒有這個選項。

+0

謝謝。在我的場景中,層次結構(樹)僅使用一個表進行建模,其中每行保存有關節點及其父節點ID的數據。 – jamesfm 2009-05-04 19:38:48

0

感謝您的這些建議。

我開始意識到,答案是重塑數據庫中的數據 - 無論是按照喬治建議的嵌套集合,還是我剛剛遇到的傳遞閉包表。

這樣的話,我希望能得到兩個好處:

一)更快的查詢aginst任意子樹

B)數據模型,不再需要遞歸查詢 - 所以也許把它很方便達到實體框架!

對於一個困難的問題,正確的答案往往不是回答它,而是要做別的事情,這總是令人驚訝!