Я эффективно делаю следующее:
session.Save(newParent);
newChild = new Child(parent: newParent);
session.Save(newChild);
session.Load<Parent>(newParent.Id).Children.Count //0 - calling Get has the same result
Однако, если перед вызовом Load я вызову session.Refresh (newParent), дочерние элементы будут загружены правильно. Таким образом, он явно кэширует родительский объект до того, как у него появятся дочерние элементы, а затем не обновляет кэш новым дочерним элементом при добавлении.
Родительское сопоставление:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyApp.Models.Entities.Parent,MyApp" table="[Parent]" lazy="true" batch-size="100">
<id name="ParentId" column="ParentId" type="int">
<generator class="native" />
</id>
<bag name="Children" inverse="true" lazy="true" cascade="delete" batch-size="100">
<key column="ParentId" />
<one-to-many class="MyApp.Models.Entities.Child,MyApp" />
</bag>
</class>
</hibernate-mapping>
Детское картирование:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyApp.Models.Entities.Child,MyApp" table="[Child]" lazy="true" batch-size="100">
<id name="ChildId" column="ChildId" type="int">
<generator class="native" />
</id>
<many-to-one name="Parent" column="ParentId" cascade="save-update" />
</class>
</hibernate-mapping>
Мой вопрос: 1) Я делаю что-то не так или это поведение по умолчанию? 2) Если нет, какой самый чистый способ решить эту проблему?
Эта проблема на самом деле возникает только в тестовом проекте, и я могу изменить базовую тестовую архитектуру, чтобы в этом случае выполнить принудительное обновление за кулисами, но я хотел бы полностью понять, что происходит, прежде чем внедрять решение.
Использование NHibernate 3.2 и все обернуто в транзакцию ReadCommitted.