2011-06-11 68 views
0

我想設計一個基地樹節點類從其他實體類可以得到,我認爲這將是這樣的:樹節點設計首先

public abstract class BaseTreeNode 
{ 
    public string Id{get;set;} 

    public string Name{get;set;} 

    public string ParentId{get;set;} 

    [ForeignKey("ParentId")] 
    public BaseTreeNode ParentNode{get;set;} 
} 

public class MenuNode:BaseTreeNode 
{ 

} 

但是,它似乎並不嘗試使用MenuNode類構建某些層次結構時工作。當我調用SaveChanges方法時,它拋出一個SqlException:無效的對象名'dbo.BaseTreeNode'。

我認爲問題是關於屬性'ParentNode',因爲它是一個抽象類。 那麼,我應該如何在這種情況下首先使用實體​​框架4.1代碼來設計我的類。

非常感謝!

+0

有人能幫助我嗎? – NicolasZ 2011-06-12 05:13:31

+0

我不認爲問題是'ParentNode'屬性。該模型是有效的(除了'PrarentId',我猜只是一個錯字)。問題一定在其他地方。你可以顯示1)你的DbContext的DbSet屬性,2)任何Fluent映射,如果你有一個,3)拋出異常的代碼。 – Slauma 2011-06-12 17:57:10

回答

0

這種方法的問題將是性能。您可能需要在數據庫(Menu/SubMenu,Category/Subcategory)中存儲多種類型的樹,但是這種類型的繼承將導致所有這些樹一起存儲在一個表中。看到這個問題:What are the pros and cons of one master base table which all entities inherit from?

問題是,是否有必要查詢所有類型的節點,而不管樹的類型如何。

+0

其實我認爲你錯了Loren,EF會爲每個派生類型生成一個表,所以他應該在db中創建一個名爲MenuNode的表,並且創建其他節點類型,基類型實際上只在ac#上下文中用於允許clr構建一個完整的對象 – War 2012-08-01 17:36:18

+0

不,我只是試了一下。默認行爲是每層繼承,這意味着所有子類都存儲在一個表中,並使用鑑別器列來區分子類。在這個例子中,結果表被命名爲BaseTreeNodes,並且鑑別器列被定義爲「[Discriminator] [nvarchar](128)NOT NULL」 – 2012-08-23 06:57:15

+0

特別是......我最近寫了一個帶有EF代碼的基本文檔管理系統,這個方法在我的C#代碼中。我結束了3個類(FileSystemObject,目錄,文件),後者2繼承了第一個,並且我在數據庫(目錄,文件)中有2個表。 – War 2012-09-09 14:05:54