0

私はNHibernateで双方向の関係を持っています:

<class name="Child" table="Children">
  <many-to-one name="Parent" column="ParentId" not-null="true" />
</class>

<class name="Parent">
  <set name="Children" lazy="true" table="Children" cascade="all">
    <key column="ParentId" not-null="true" />
    <one-to-many class="Child" />
  </set>
</class>

inverse="true" を設定せずに保存し、子に親プロパティを設定するにはどうすればよいですか?
POCOの観点からはあまり意味がないので、私はこれをしたくありません.

または、NHibernate プロキシ コレクション (子) で呼び出された Add をインターセプトすることは可能ですか?
その場合、Parent 設定ロジックをここに配置します。

4

1 に答える 1

4

外部キーを null 可能にし、挿入とそれに続く更新を受け入れるつもりでない限り、それが NHibernate で双方向の 1 対多が機能する方法です。

私はあなたが使用できるこのパターンの一般的な実装を持っています...それは概念の証明です。POCOのアプローチをちょっと壊しているので、見方によっては便利かもしれませんが...まあ、ここにあります:

public interface IHaveParent<T>
{
    T Parent { get; set; }
}

public interface IHaveMany<T>
{
    ICollection<T> Children { get; }
}

public static class OneToManyHelper
{
    public static void AddChild<TParent, TChild>(this TParent parent,
                                                 TChild child)
    where TChild : IHaveParent<TParent>
    where TParent : IHaveMany<TChild>
    {
        parent.Children.Add(child);
        child.Parent = parent;
    }
}

AddChildこれにより、すべての親に対してすべてのことができます。

Add 呼び出しをインターセプトする際の問題は、常に特別な方法 (POCO ではない) を使用してコレクションをインスタンス化する必要があることです。

于 2010-04-02T02:53:53.023 に答える