使用EF或NHibernate的存储库模式中的分层结构

时间:2012-02-04 15:49:36

标签: c# entity-framework nhibernate hierarchical-data

请建议使用EF4(代码优先)或nHibernate的存储库模式管理层次结构的方法/教程?

举个例子,假设我要显示以下内容:

Topic
 -> Comment1
   -> Comment1_1
   -> Comment1_2
      -> Comment1_2_1

什么是理想的类结构?如何与ORM和存储库模式连接?关于存储库模式和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
   }

2 个答案:

答案 0 :(得分:2)

可能你正在尝试将树映射到关系模型。看看how to map a tree in nhibernate

答案 1 :(得分:1)

如果每条评论都引用了父主题,则无需再做任何其他事情。您将始终在应用程序逻辑中加载包含所有相关注释和遍历层次结构的主题,因为注释将具有正确配置的父级(在这种情况下,它还应具有依赖项集合以使遍历更容易)。

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

  1. 加载主题和所有相关评论(每个评论都有TopicId,尽管它在层次结构中的位置) - 所有EF内容都在此结束,因为您拥有所需的所有数据
  2. 处理ParentId为空的所有注释
  3. 对于每个已处理的评论,请执行您需要的一切
  4. 对于当前处理的评论的每个依赖评论,请转到3.(递归)
  5. 更复杂的情况是,如果您想单独使用某些注释 - 例如,获取某些指定注释的注释层次结构。在这种情况下,您必须使用本机SQL来加载注释并利用CTE(公用表表达式 - 仅S​​QL Server 2005和更高版本)进行分层查询。该方法在@pborovik发布的文章中有描述,在EF的情况下非常相似。