2012-02-04 80 views
0

请建议关于如何使用EF4(Code First)或nHibernate使用存储库模式管理分层结构的方法/教程?使用EF或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 
    } 

回答

1

如果每条评论都获得对父主题的引用,则不需要再进行其他操作。您将始终在您的应用程序逻辑中加载所有相关注释和遍历层次结构的主题,因为注释将正确配置父项(在这种情况下,它还应该具有用于​​使遍历更容易的依赖项集合)。

所以算法具有这种结构的工作应该是:

  1. 负载主题和所有相关评论(每条意见都有TopicId尽管它在层次中的位置的) - 因为你把所有的数据全部EF的东西在这里结束你需要
  2. 过程的所有意见,其中的ParentId为空
  3. 对于每一个处理意见做你需要的一切
  4. 对于当前处理意见的各相关评论去3(递归)

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

+0

嗨..谢谢。这是理所当然的。不过,我已经看到部分加载注释的网站,并且随着您继续滚动,大量注释不断被附加。这可能是使用Take()Skip()方法实现的,但有趣的部分是需要加载多少。一个顶级评论应该得到所有的子评论。 – helloworld 2012-02-05 15:09:19

+0

在这种情况下,您将不得不使用SQL来控制每个查询加载的顶级代码的数量。每个顶层coment也将加载它的所有依赖。 – 2012-02-05 18:06:48