NHibernate:双向多对一问题

时间:2010-04-01 21:42:07

标签: nhibernate poco many-to-one

我在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”并在Child上设置Parent属性的情况下保存它? 我不想这样做,因为从POCO的角度来看,它没有多大意义。

或者,是否可以拦截在NHibernate代理集合(子)上调用Add? 在这种情况下,我只是将Parent设置逻辑放在这里。

1 个答案:

答案 0 :(得分:4)

除非你愿意让外键可以为空并接受插入后跟更新,否则这就是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

拦截添加调用的问题在于,您始终需要使用特殊方法(同样不是POCO)来实例化您的集合。