3

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

我有一个 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(如果有的话 - 这可能是 null )

我正在努力弄清楚应该如何在我的对象模型中定义它。另外,一旦我配置了这个,我将如何拯救孩子?会不会是这样的

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

4

1 回答 1

3

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

无论如何,您必须将其“链接”到它的父级,如果不想出现异常......只有在映射中
未指定时,您才必须独立保存子级:Cascade.Save\All()

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

您必须添加一个Parent属性以将“子”连接到它的“父”。
它的映射是:

References(x => x.Parent);       

PS
你不必写Not.NullableId这是默认值。

于 2012-01-21T18:33:47.410 回答