0

我有这种情况:混合双/单方向的节点 - (流利)NHibernate的

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

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

如果删除它,则可以将添加到父级的子级保留。请记住,如果您不指定其中一条边为Inverse,则会有多余的更新。

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


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

+0

谢谢明天我会看看这个。我试图在过去删除Inverse,它不起作用。我的对象图不是很大,所以Not.LazyLoad没问题。 – cs0815 2012-07-31 18:24:30

+0

抱歉删除逆向没有任何区别。 – cs0815 2012-08-01 07:44:42

+0

你最近怎么节约?你在做交易中的一切吗? – 2012-08-01 10:14:34