Как мне отобразить отношения, где дочерняя конечная точка предоставляется через свойство Id, а не через весь родительский объект?
Вот пример:
class Parent {
public Guid Id { get; set; }
public List<Child> Chlidren { get; set; }
}
class Child {
public Guid Id { get; set; }
public Guid ParentId { get; set; }
}
Вот эквивалентные сопоставления, которые я использую:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Blabla"
namespace="Blabla"
auto-import="false">
<typedef name="ChildrenList" class="Blabla" />
<class name="Parent" table="Parent" lazy="false">
<id name="Id" column="ID" type="Guid">
<generator class="guid" />
</id>
<bag name="Children" table="Child"
cascade="save-update"
collection-type="ChildrenList"
lazy="false">
<key column="ParentID" not-null="true" />
<one-to-many class="Child" />
</bag>
</class>
<class name="Child" table="Child" lazy="false">
<id name="Id" column="ID" type="Guid">
<generator class="guid" />
</id>
<!-- How to map ParentID here? -->
</class>
</hibernate-mapping>
Когда я создаю родителя, добавляю несколько детей в коллекцию Children
и затем сохраняю родителя, все в порядке. Но если сначала сохранить родительский объект, а затем создать дочерний объект, установив для его свойства ParentID идентификатор родительского объекта, то я получу
NHibernate.PropertyValueException:
not-null property references a null or transient value Child._Parent.ChildrenBackref
Все попытки сопоставить отношения many-to-one
приводили к различным исключениям при создании конфигурации NHibernate. В основном о несоответствии типов объектов.
Я уверен, что NHibernate способен справиться с этим сценарием. Должно быть что-то довольно простое, что я скучаю.
EDIT:
Я думаю, что это имеет смысл для примера теста, который завершается неудачей с приведенным выше исключением:
var child = new Child(Create.Saved<Parent>().Id); // this sets the ParentId property
this.Repository.Save(child); // here I get the exception
Мои мысли, почему NHibernate поднимает это: Children
свойство класса Parent
, сопоставленное таким образом, что говорит, что ребенок не может существовать без родителя (<key column="ParentID" not-null="true" />
). Когда я пытаюсь сохранить дочерний элемент, NHibernate пытается разрешить это отношение (найти родителя, к которому относится этот дочерний элемент) и завершается неудачей, поскольку в сопоставлении ему не предоставляется дочерняя конечная точка (которая в противном случае была бы ParentId
свойством), он проверяет наличие его собственная Child._Parent.ChildrenBackref
конечная точка, какой бы она ни была.
Это похоже на желаемое решение: отображение ParentId
свойства как дочерней конечной точки отношения. Это заставит NHibernate разрешить родительский элемент, используя значение ParentId
свойство в качестве первичного ключа родителя.
Дело в том, что я не знаю, возможно ли это.