【问题标题】:Fluent nHIbernated - HasMany relationship in same tableFluent nHIbernate - 同一张表中的 HasMany 关系
【发布时间】:2012-01-21 18:22:09
【问题描述】:

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

我有一个 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();
}

基本上我希望能够创建一个“顶级”菜单项,然后向其中添加一些子项 - 在数据库术语中,应该有一个包含父菜单项 ID 的 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();

我想我赢了!这是最好的方法吗?谢谢gdoron

【问题讨论】:

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


    【解决方案1】:

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

    无论如何,您必须将其“链接”到它的父级,如果不想获得例外...
    仅当您未在映射中指定 Cascade.Save\All() 时,您才必须独立保存孩子:

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

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

    References(x => x.Parent);       
    

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

    【讨论】:

    • 我现在保存了它,但是如果我不保存父母和孩子,它就不起作用 - 你能看到问题吗?此外,我是否必须执行手动过程来加载带有子集的父对象?似乎该对象不会使用 oMenuObjects = session .CreateCriteria(typeof(MenuObject)) .Add(Expression.Eq("Active", active)) .List(); 加载当前对象
    • @user1162591。看起来您以正确的方式保存它。因此,如果不救孩子就行不通,那就救他。你的CreateCriteria中的Active是什么?,你到底想达到什么目的?
    • 我的标准如下:oMenuObjects = session .CreateCriteria(typeof(MenuObject)) .Add(Expression.Eq("Active", active)) .List&lt;MenuObject&gt;(); return oMenuObjects; 当我只有单一属性时,此查询有效 - 现在我有一个集合属性(儿童),查询不起作用。我需要在查询中明确填写集合吗?
    • @user1162591。但是您在 MenuObject 实体中没有 Active。 ?
    • @user1162591。 QueryCriteria session.Query&lt;MenuObject&gt;().Where(x =&gt; x.Active == active).Select(x =&gt; x.Children).ToList(); 更容易 Ayende 博客 post
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 2011-06-26
    • 2011-02-27
    • 2012-04-03
    • 2015-11-22
    • 1970-01-01
    • 2014-04-02
    • 2012-10-19
    相关资源
    最近更新 更多