NHibernate: кэшированный родительский объект первого уровня не обновляется при вставке дочернего объекта - PullRequest
0 голосов
/ 27 января 2012

Я эффективно делаю следующее:

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.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Где вы добавляете ребенка в родительскую коллекцию Children? Установка ссылки из newChild.Parent на newParent не добавляет newChild в коллекцию детей newParent, вы должны это сделать. Вот почему принято объявлять коллекции частными членами (сопоставленными с помощью стратегии доступа) и писать методы AddChild и RemoveChild, которые поддерживают отношения с обеих сторон.

0 голосов
/ 31 января 2012

1) Я что-то не так делаю или это поведение по умолчанию?

В некотором смысле, правильный способ справиться с этим - добавить их за один раз и использовать каскад. Однако это не подходит для моей конкретной ситуации.

2) Если нет, то какой самый чистый способ решить эту проблему?

Нет особо чистого способа решить эту проблему. Я испек обновление родительского объекта в кэше в тестовой архитектуре.

Спасибо, Джейми и Филл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...