NHibernate: двунаправленная проблема много-к-одному - PullRequest
0 голосов
/ 02 апреля 2010

У меня двунаправленные отношения в 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" и не устанавливая свойство Parent для Child?
Я не хочу этого делать, потому что это не имеет особого смысла с точки зрения POCO.

В качестве альтернативы, можно ли перехватить Add, вызываемый в коллекции прокси NHibernate (Children)?
В этом случае, я бы просто поместил здесь логику установки Родителя.

1 Ответ

4 голосов
/ 02 апреля 2010

Если вы не хотите, чтобы внешний ключ обнулялся и принимал вставку с последующим обновлением, в NHibernate работает двунаправленный один-ко-многим.

У меня есть общая реализация этого паттерна, которую вы можете использовать ... это подтверждение концепции; это может быть полезно или нет, в зависимости от того, как вы на это смотрите, поскольку это как бы нарушает подход 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).

...