Свободное владение nHIbernated - HasMany в одной таблице - PullRequest
2 голосов
/ 21 января 2012

Я создаю модель для структуры верхнего меню сайта -

У меня есть модель MenuObject:

public class MenuObject
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual List<MenuObject> Children { get; set; }
}

и отображение:

public mapMenu()
{
    Id(x => x.Id)
        .Not.Nullable();
    Map(x => x.Title)
        .Not.Nullable();
    HasMany<MenuObject>(x => x.Children)
         .AsList();
}

По сути, я хочу иметь возможность создать элемент меню «Верхний уровень», а затем добавить к нему некоторые дочерние элементы - в терминах базы данных должно быть поле ParentId, содержащее идентификатор родительского элемента меню (если есть - этот может быть нулевым)

Я изо всех сил пытаюсь понять, как это должно быть определено в моей объектной модели. Кроме того, как только я это настрою, как мне спасти детей? Было бы что-то вроде

public void InsertChild(MenuObject parent, MenuObject child)
{
    parent.Children.add(child)
    session.SAve(parent)
    .....
}

или я должен был бы сохранить ребенка независимо и явно связать его с родителем?

Редактировать *****

Спасибо - теперь в моей модели есть следующее:

        public virtual MenuObject Parent { get; set; }
        public virtual List<MenuObject> Children { get; set; }

и это в отображении:

 HasMany(x => x.Children)
       .AsList()
       .Inverse()
       .Cascade.All()
       .KeyColumn("ParentId");

        References(x => x.Parent, "ParentId");

Теперь я могу добавить детей в родительские элементы следующим образом:

oChild.Parent = oParent;
session.SaveOrUpdate(oParent);
session.Save(oChild);
transaction.Commit();

Я думаю, что я победитель! Это лучший способ сделать это? Спасибо Гдорон

1 Ответ

3 голосов
/ 21 января 2012

или я должен был бы сохранить ребенка независимо и явно связать его с родителем?

В любом случае вам нужно «связать» его с родителем, если не хотите получать исключения ...
Вы должны будете спасти ребенка самостоятельно, только если вы не укажете Cascade.Save\All() в отображении:

HasMany<MenuObject>(x => x.Children)
    .AsList().Inverse.Cascade.All(); // Inverse will increase performance.

Вы должны добавить свойство Parent, чтобы связать «потомок» с его «Родителем».
Это отображение:

References(x => x.Parent);       

приписка
Вам не нужно писать Not.Nullable на Id, это значения по умолчанию.

...