流利的nHIbernate - 同一个表中的HasMany关系

时间:2012-01-21 18:22:09

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent fluent-nhibernate-mapping

我正在为网站顶级菜单结构创建一个模型 -

我有一个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字段,其中包含父菜单项的ID(如果有的话 - 这个可能是空的)

我正在努力探讨如何在我的对象模型中定义它。此外,一旦我配置了这个,我将如何拯救孩子?会不会像

那样
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();

我想我是一个胜利者!这是最好的方法吗?谢谢gdoron

1 个答案:

答案 0 :(得分:3)

  

或者我是否必须独立保存孩子并明确地将其链接到父母?

无论如何,你必须将它“链接”到它的父母,如果不想得到例外......
只有在映射中未指定Cascade.Save\All()时,才必须单独保存子项:

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

您必须添加Parent属性才能将“child”连接到“Parent” 它的映射是:

References(x => x.Parent);       

P.S。
您不必在Not.Nullable上写Id,这是默认设置。