我正在为网站顶级菜单结构创建一个模型 -
我有一个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
答案 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
,这是默认设置。