C# 使用EF或NHibernate的存储库模式中的层次结构

C# 使用EF或NHibernate的存储库模式中的层次结构,c#,entity-framework,nhibernate,hierarchical-data,C#,Entity Framework,Nhibernate,Hierarchical Data,请提供有关如何使用EF4(代码优先)或nHibernate的存储库模式管理层次结构的方法/教程? 例如,假设我必须显示以下内容: Topic -> Comment1 -> Comment1_1 -> Comment1_2 -> Comment1_2_1 理想的类结构是什么?它应该如何与ORM和存储库模式联系起来?有很多关于repository模式和EF/nHibernate的文章,但我找不到一篇使用分层结构的文章 我对班级结构的思考: Clas

请提供有关如何使用EF4(代码优先)或nHibernate的存储库模式管理层次结构的方法/教程?

例如,假设我必须显示以下内容:

Topic
 -> Comment1
   -> Comment1_1
   -> Comment1_2
      -> Comment1_2_1
理想的类结构是什么?它应该如何与ORM和存储库模式联系起来?有很多关于repository模式和EF/nHibernate的文章,但我找不到一篇使用分层结构的文章

我对班级结构的思考:

Class Topic 
   {
   public int ID {get;set;}
   public string Topic {get;set;}
   }

Class Comment
   {
   Public int ID {get;set;}
   Public int TopicID {get;set}
   Public string Comment {get;set;}
   Public int ParentID {get;set;}   //recursion will happen here
   Public int Level {get;set;} //Can be used to bypass recursion and display topic with all comments with indention based on Level
   }

可能您正在尝试将树映射到关系模型。看一看。

可能您正在尝试将树映射到关系模型。看一看。

如果每条评论都提到了父主题,你就不需要做更多的事情了。您将始终使用所有相关注释加载主题,并在应用程序逻辑中遍历层次结构,因为注释将正确配置父对象(在这种情况下,它还应该具有依赖项集合,以使遍历更容易)

因此,使用此结构的算法应为:

  • 加载主题和所有相关注释(每个注释都有
    TopicId
    ,尽管它在层次结构中的位置不同)-所有EF内容都在这里结束,因为您拥有所需的所有数据
  • 处理ParentId为null的所有注释
  • 对于每个已处理的注释,请执行您需要的所有操作
  • 对于当前处理的注释的每个从属注释,请转到3。(递归)

  • 更复杂的情况是,如果要单独处理某些注释,例如,获取某些指定注释的注释层次结构。在这种情况下,必须使用本机SQL加载注释,并利用CTE(公共表表达式-仅限SQL Server 2005和更新版本)进行分层查询。@pbrovik发布的文章中描述了这种方法,EF的情况非常类似。

    如果每条评论都引用了父主题,您就不需要做更多的事情了。您将始终使用所有相关注释加载主题,并在应用程序逻辑中遍历层次结构,因为注释将正确配置父对象(在这种情况下,它还应该具有依赖项集合,以使遍历更容易)

    因此,使用此结构的算法应为:

  • 加载主题和所有相关注释(每个注释都有
    TopicId
    ,尽管它在层次结构中的位置不同)-所有EF内容都在这里结束,因为您拥有所需的所有数据
  • 处理ParentId为null的所有注释
  • 对于每个已处理的注释,请执行您需要的所有操作
  • 对于当前处理的注释的每个从属注释,请转到3。(递归)

  • 更复杂的情况是,如果要单独处理某些注释,例如,获取某些指定注释的注释层次结构。在这种情况下,必须使用本机SQL加载注释,并利用CTE(公共表表达式-仅限SQL Server 2005和更新版本)进行分层查询。@pborvik发布的文章中描述了这种方法,EF的情况非常类似。

    Hi。。谢谢这当然是理想的。然而,我看到过一些网站,评论部分加载,当你不断滚动时,大量的评论不断被添加。这可能可以通过使用Take()Skip()方法实现,但有趣的是要加载多少。一个顶级注释应该得到所有子注释。在这种情况下,您必须使用SQL来控制每个查询加载的顶级注释的数量。每个顶级组件也将加载其所有依赖项。嗨。。谢谢这当然是理想的。然而,我看到过一些网站,评论部分加载,当你不断滚动时,大量的评论不断被添加。这可能可以通过使用Take()Skip()方法实现,但有趣的是要加载多少。一个顶级注释应该得到所有子注释。在这种情况下,您必须使用SQL来控制每个查询加载的顶级注释的数量。每个顶级组件也将加载其所有依赖项。