Tree 实体框架代码中的树节点设计

Tree 实体框架代码中的树节点设计,tree,entity-framework-4.1,ef-code-first,Tree,Entity Framework 4.1,Ef Code First,我想设计一个基础树节点类,其他实体类可以从中派生,我想它是这样的: 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 c

我想设计一个基础树节点类,其他实体类可以从中派生,我想它是这样的:

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类构建一些层次结构时,它似乎不起作用。它抛出了一个SqlException:当我调用SaveChanges方法时,对象名“dbo.BaseTreeNode”无效

我认为问题在于属性“ParentNode”,因为它是一个抽象类。 那么,在这种情况下,我应该如何首先使用EntityFramework4.1代码设计我的类呢


非常感谢

这种方法的问题在于性能。您可能希望在DB(菜单/子菜单、类别/子类别)中存储多种类型的树,但这种类型的继承将导致所有树一起存储在一个表中。见这个问题:


问题在于是否有必要查询所有类型的节点,而不考虑树的类型。

我认为问题不在于
ParentNode
属性。该模型是有效的(除了
PrarentId
,我想这只是一个输入错误)。问题一定在别的地方。你能用DbSet属性显示1)你的DbContext吗,2)任何流畅的映射(如果你有),3)引发异常的代码。实际上我认为你错了Loren,EF会为每个派生类型生成一个表,所以他应该在db中创建一个名为MenuNode的表,以及他创建的其他节点类型,基本类型实际上只在c#上下文中使用,以允许clr构建完整的objectNo,我只是尝试了一下。默认行为是每个层次结构表继承,这意味着所有子类都存储在一个表中,并使用鉴别器列来区分子类。在本例中,生成的表名为BaseTreeNodes,鉴别器列定义为“[discriminator][nvarchar](128)NOT NULL”如何。。。我最近用EF代码编写了一个基本的文档管理系统,在我的C#代码中首先采用了这种方法。我最终得到了3个类(FileSystemObject、Directory、File),后2个继承了第一个类,我在数据库中得到了2个表(Directory、Files)。