混合bi / uni方向节点 - (流畅)nhibernate

时间:2012-07-31 16:50:33

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

我遇到这种情况:

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之间的连接不会持久存在。也许我必须改变领域模型,但我希望能够实现这种“单向/双向”的混合。

感谢。

PPS:

保存:

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

...

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

1 个答案:

答案 0 :(得分:1)

通过设置Inverse,您告诉NHibernate 其他大小(Parent引用)是维持关系的那个。

如果删除它,您将能够将已添加到父级的子项保留。请注意,如果您未将其中一方指定为Inverse,则会有多余的更新。

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


无关:.Not.LazyLoad是一个非常糟糕的主意,特别是在层次结构上。