2012-02-04 2 views
0

Просьба предложить подход/учебник о том, как иерархические структуры управляются с использованием шаблона репозитория с EF4 (Code First) или nHibernate?Иерархическая структура в шаблоне репозитория с использованием EF или NHibernate

В качестве примера, скажем Я, чтобы отобразить следующее:

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

Что идеальная структура класса и как он должен соединять с ОРМ и хранилище шаблона? Есть много статей о шаблоне репозитория и 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

Hi .. спасибо. Это идеальный вариант. Однако я видел сайты, где комментарии частично загружены, и когда вы продолжаете прокручивать, куски комментариев продолжают добавляться. Вероятно, это может быть достигнуто с помощью методов Take() Skip(), но интересной частью является загрузка. Один комментарий на верхнем уровне должен содержать все комментарии. – helloworld

+0

В таком случае вам придется использовать SQL, чтобы получить контроль над количеством компиляторов верхнего уровня, загруженных для каждого запроса. Каждый компилятор верхнего уровня также загружает все свои зависимости. –

Смежные вопросы