Иерархическая структура в репозитории с использованием EF или NHibernate - PullRequest
0 голосов
/ 04 февраля 2012

Пожалуйста, предложите подход / учебное пособие о том, как иерархические структуры управляются с использованием шаблона хранилища с EF4 (Code First) или 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 ]

2 голосов
/ 04 февраля 2012

Возможно, вы пытаетесь отобразить дерево на реляционную модель. Посмотрите на как отобразить дерево в nhibernate .

1 голос
/ 04 февраля 2012

Если каждый комментарий получает ссылку на родительскую тему, вам больше ничего не нужно делать.Вы всегда будете загружать тему со всеми связанными комментариями и иерархией обхода в логике приложения, потому что для комментария будет правильно настроен родительский элемент (в этом случае он также должен иметь коллекцию зависимостей, чтобы сделать обход проще).

Таким образом, алгоритмдля работы с этой структурой должно быть:

  1. Загрузить тему и все связанные комментарии (каждый комментарий имеет TopicId, несмотря на свою позицию в иерархии) - здесь все содержимое EF заканчивается, потому что у вас есть все необходимые данные
  2. Обработка всех комментариев, где ParentId равен нулю
  3. Для каждого обработанного комментария сделайте все, что вам нужно
  4. Для каждого зависимого комментария текущего обработанного комментария перейдите к 3. (рекурсия)

Более сложная ситуация, если вы хотите работать с некоторыми комментариями по отдельности - например, получить иерархию комментариев для некоторого указанного комментария.В таком случае вы должны использовать собственный SQL для загрузки комментариев и использовать CTE (общее табличное выражение - только SQL Server 2005 и новее) для иерархических запросов.Подход был описан в статье, опубликованной @pborovik, и он очень похож в случае EF.

...