Реализация параллелизма в NHibernate - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть проект, реализованный NHibernate и использующий Lazy Loading. У меня есть три класса в этом проекте: человек, личность и семья. Означает ли, что человек имеет одну личность и список семьи. Сопоставление:

<class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <version name="Version" />

    <property name="Name" column="Name"
              type="String(255)" update="true" insert="true" access="property" not-null="false" />

    <one-to-one name="Identity" property-ref="Person"
      class="Domain.Entities.PersonIdentity,Domain.Entities" cascade="delete" fetch="select" />

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,Domain.Entities"/>
    </bag>

</class>

Мои проблемы - обсуждение параллелизма. Первая проблема заключается в том, что: При обновлении Person поле версии в таблице Person будет обновлено и будет иметь значение true, но При обновлении удостоверения поле версии в таблице Person не будет обновлено и будет иметь значение false. Почему при обновлении удостоверения поле версии в таблице Person в базе данных не обновляется?

Вторая проблема заключается в том, что: При добавлении семейства поле версии в таблице Person будет обновлено и будет иметь значение true, и Когда семейство удалено, поле версии в таблице Person будет обновлено и будет иметь значение true, но При обновлении семейства поле версии в таблице Person не будет обновлено и будет иметь значение false. Почему при обновлении семейства поле версии в таблице Person в базе данных не обновляется?

1 Ответ

1 голос
/ 08 ноября 2011

поле версии обновляется только в том случае, если свойства / коллекции самой сущности обновляют не зависимые сущности, поэтому при добавлении / удалении семейств изменяется коллекция Person, а при обновлении семейства Person вообще не изменяется. если у вас есть семантика, что Человек не должен обновляться при изменении семьи, включите его в транзакцию

using (var tx = session.BeginTransaction())
{
    session.SaveOrUpdate(person);
    tx.Commit(); // throws here if there is conflict in a family
}

обновить версию Person при изменении личности вы можете в Person.hbm.xml

<join table="PersonIdentityTable" column="PersonId">
  <component name="Identity">
    // map properties here
  </component>
</join>
...