Fluent nHIbernated-在同一个表中有许多关系

Fluent nHIbernated-在同一个表中有许多关系,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent,fluent-nhibernate-mapping,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; } } 或者我必须独立地保存孩子,并将其明确地链接到家长 编辑*****

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

我有一个MenuObject模型:

public class MenuObject
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual List<MenuObject> Children { get; set; }
}
或者我必须独立地保存孩子,并将其明确地链接到家长

编辑******

谢谢-现在我的模型中有以下内容:

        public virtual MenuObject Parent { get; set; }
        public virtual List<MenuObject> Children { get; set; }
现在,我可以通过以下方式将子项添加到父itms:

oChild.Parent = oParent;
session.SaveOrUpdate(oParent);
session.Save(oChild);
transaction.Commit();
我想我会赢的!这是最好的方法吗?谢谢你,格多伦

或者我必须独立地保存孩子,并将其明确地链接到家长

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

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

        References(x => x.Parent, "ParentId");
HasMany<MenuObject>(x => x.Children)
    .AsList().Inverse.Cascade.All(); // Inverse will increase performance.
附加说明

你不必写
Not.Nullable
Id
上,这是默认值。

我现在保存了它,但是如果我不同时保存父对象和子对象,它就不起作用了-你能看到问题吗?另外,我必须执行手动过程来加载包含子对象的父对象吗?该对象似乎不会加载当前的子对象sing oMenuObjects=session.CreateCriteria(typeof(MenuObject)).Add(Expression.Eq(“Active”,Active)).List();@user1162591.看起来您保存它的方式是正确的。因此,如果没有保存子项,它就不能工作,那么请保存它。您的
CreateCriteria
中有什么活动,您希望实现什么?我的标准如下:
oMenuObjects=session.CreateCriteria(typeof(MenuObject)).Add(Expression.Eq(“Active”,Active)).List();return oMenuObjects;
当我只有单个属性时,此查询工作正常-现在我有了集合属性(Children),查询不起作用。我需要在查询中显式填充集合吗?@user1162591。但是您在MenuObject实体中没有活动项。@user1162591。
query
Criteria
session.query()。其中(x=>x.Active==Active)。选择(x=>x.Children.ToList();
更多信息,请访问Ayende博客
oChild.Parent = oParent;
session.SaveOrUpdate(oParent);
session.Save(oChild);
transaction.Commit();
HasMany<MenuObject>(x => x.Children)
    .AsList().Inverse.Cascade.All(); // Inverse will increase performance.
References(x => x.Parent);