我遇到这种情况:
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();
答案 0 :(得分:1)
通过设置Inverse
,您告诉NHibernate 其他大小(Parent
引用)是维持关系的那个。
如果删除它,您将能够将已添加到父级的子项保留。请注意,如果您未将其中一方指定为Inverse
,则会有多余的更新。
保持内存一致性的更好选择是添加一个帮助方法AddChild(Node)
,将节点添加到集合,设置其Parent属性。
无关:.Not.LazyLoad
是一个非常糟糕的主意,特别是在层次结构上。