混合双向/单向节点-(fluent)nhibernate

混合双向/单向节点-(fluent)nhibernate,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,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 _ch

我有这样的情况:

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; }
    }
}
公共抽象类节点:实体
{
公共虚拟节点父节点{get;set;}
私有ICollection_children=new HashSet();
公共虚拟ICollection子对象
{
获取{return\u children;}
设置{u 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();
    }
}
公共类节点映射:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.HasMany(x=>x.Children)
.KeyColumn(“父ID”)
.KeyNullable()
1.资产()
.Inverse()
.Cascade.SaveUpdate()
.ForeignKeyConstraintName(“FK\u节点\u父ID”)
.Not.LazyLoad();
}
}
只有将父节点添加到子节点,将子节点添加到父节点,节点之间的连接才会持久化。但是,如果只是将父节点添加到子节点,我希望在节点之间保持“连接”。我可以通过fnh映射实现这一点吗

附言:

让我把事情说清楚一点。我有5个节点(1,2,3,4,5)

这些之间存在双向连接:

Parent <-> Child
1 <-> 2
2 <-> 3
2 <-> 6
3 <-> 4
4 <-> 5
父-子 1 2 2 3 2 6 3 4 4 5 但是在6和4之间只有一个单向连接,因为4已经有一个父节点,即3

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

谢谢

缴费灵:

保存:

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

...

NodeRepository.SaveOrUpdate(Node1); // save topnode
NodeRepository.DbContext.CommitChanges();
INHibernateRepository noderpository=new NHibernateRepository();
...
NodeRepository.SaveOrUpdate(Node1);//保存topnode
NodeRepository.DbContext.CommitChanges();

通过设置
反向
,您告诉NHibernate另一个大小(父级参考)是维持关系的大小

如果删除该项,则可以保留添加到父项的子项。请记住,如果不将其中一个面指定为
反向
,则会有多余的更新

保持内存一致性的更好的替代方法是添加一个helper方法
AddChild(Node)
,该方法将节点添加到集合中并设置其父属性



不相关:
。不是。懒散加载是一个非常糟糕的主意,尤其是在层次结构上。

谢谢,我明天会对此进行研究。我过去曾试图删除反向,但它不起作用。我的对象图不是很大,所以不是。懒散的负载是可以的。对不起,删除反转没有任何区别。你如何保存?您是否在事务中执行所有操作?我使用的是s#arp体系结构存储库。请参阅PPS。创建一个简单的单元测试,在手动创建的会话和事务中保存新节点和子节点,以便您可以测试映射并确定它是否独立于应用程序的其余部分工作。