Если вы не хотите, чтобы внешний ключ обнулялся и принимал вставку с последующим обновлением, в 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).