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; }
    }
}

ノードには、最大1つの親と複数の子を含めることができます。私はこのマッピングファイルを使用します:

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

ただし、4にはすでに3という親があるため、6と4の間の単方向接続のみです。

残念ながら、6と4の間の接続は維持されません。ドメインモデルを変更する必要があるかもしれませんが、この「ユニ/バイ指向性の混合」を実現できることを望んでいました。

ありがとう。

PPS:

保存:

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

...

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

1 に答える 1

1

を設定することにより、他のサイズ(参照)が関係を維持するサイズInverseであることをNHibernateに伝えます。Parent

これを削除すると、親に追加された子を永続化できるようになります。どちらかの側をとして指定しないとInverse、冗長な更新が行われることに注意してください。

AddChild(Node)メモリ内の一貫性を維持するためのより良い代替手段は、ノードをコレクションに追加し、その親プロパティ設定するヘルパーメソッドを追加することです。


無関係:.Not.LazyLoad特に階層構造では、非常に悪い考えです。

于 2012-07-31T17:42:07.287 に答える