我在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设置逻辑放在这里。
答案 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)来实例化您的集合。