0

我有这种情况:

public abstract class Node : Entity
{
    public virtual Node Parent { get; set; }

    private ICollection<Node> _children = new HashSet<Node>();
    public virtual ICollection<Node> Children
    {
        get { return _children; }
        set { _children = value; }
    }
}

一个节点最多可以有一个父节点和多个子节点。我使用这个映射文件:

public class NodeMap : IAutoMappingOverride<Node>
{
    public void Override(AutoMapping<Node> mapping)
    {
        mapping.HasMany<Node>(x => x.Children)
        .KeyColumn("ParentId")
        .KeyNullable()
        .AsSet()
        .Inverse()
        .Cascade.SaveUpdate()
        .ForeignKeyConstraintName("FK_Node_ParentId")
        .Not.LazyLoad();
    }
}

仅当我将父级添加到子级并将子级添加到父级时,节点之间的连接才会持续存在。但是,如果刚刚将父级添加到子级,我想在节点之间保持“连接”。我可以通过 fnh 映射实现这一点吗?

PS:

让我试着更清楚地说明一些事情。我有 5 个节点(1、2、3、4、5)。

这些之间存在双向连接:

Parent <-> Child
1 <-> 2
2 <-> 3
2 <-> 6
3 <-> 4
4 <-> 5

但是 6 和 4 之间只有一个单向连接,因为 4 已经有一个父节点 3。

不幸的是,6 和 4 之间的连接没有持续。也许我必须更改域模型,但我希望能够实现这种“单/双方向性的混合”。

谢谢。

PP:

保存:

INHibernateRepository<Node> NodeRepository = new NHibernateRepository<Node>();

...

NodeRepository.SaveOrUpdate(Node1); // save topnode
NodeRepository.DbContext.CommitChanges();
4

1 回答 1

1

通过设置Inverse,您告诉 NHibernate另一个大小(Parent参考)是维持关系的大小。

如果您删除它,您将能够持久添加到父级的子级。请记住,如果您不将其中一侧指定为Inverse,您将有多余的更新。

保持内存一致性的更好选择是添加一个辅助方法,该方法AddChild(Node)将节点添加到集合设置其 Parent 属性。


不相关:.Not.LazyLoad是一个非常糟糕的主意,尤其是在层次结构上。

于 2012-07-31T17:42:07.287 回答