NHibernate с кэшем второго уровня не восстанавливает свойства Помечено insert="false" update="false"?

Возникли проблемы с реализацией кэша второго уровня в Nhibernate. У меня есть класс сопоставлен следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data">
   <class name="Account" table="Accounts" lazy="false">
     <cache region="Standard" usage="read-write" include="all"/>
     <id column="ID" name="ID">
       <generator class="assigned" />
     </id>
     <version name="VersionStamp" column="VersionStamp" type="integer" unsaved-value="0" />
     <property name="Name" not-null="true" />
     <property name="Type" not-null="true" />
     <property name="ClientID" not-null="true" insert="false" update="false" />
     <property name="DateCreated" not-null="true" type="UtcDateTime" />
     <property name="LastUpdatedDate" not-null="true" type="UtcDateTime" />
     <property name="IsActive" not-null="true" />
     <many-to-one name="Client" class="Client" column="ClientID" not-found="exception" not-null="true" />
   </class>
 </hibernate-mapping>

Свойство "ClientID" является внешним ключом в таблице "Клиенты", и свойство "многие-к-одному" клиента использует его для поиска связанного объекта клиента.

Когда я добавляю новую учетную запись, я ищу объект Client из базы данных с помощью Session.Get и назначаю его свойству Client моего объекта Account. За кулисами это также автоматически заполняет свойство ClientID, когда объект записывается в базу данных, и идентификатор правильно сохраняется в базе данных. Когда я получаю объект Account из базы данных по идентификатору с помощью Session.Get, все поля заполняются правильно, когда объект извлекается.

Однако, когда я реализую кэш второго уровня, используя параметры, показанные выше, свойство ClientID НЕ заполняется, когда объект Account извлекается с помощью Session.Get, но свойство Client заполняется правильно. Есть ли какая-то причина, почему это не будет работать с кэшем второго уровня? Или я сделал что-то не так в моем отображении / конфигурации?

На данный момент я просто использую SysCache в качестве провайдера кэширования, и кеш запросов и второго уровня включен. Отображение класса Client содержит соответствующее свойство "один ко многим" для учетных записей.

Мне нравится удобство наличия свойства ClientID в моем классе Account, так что я могу читать его без использования свойства Client, и, похоже, оно отлично работает без кэширования.

Спасибо за любую помощь.

Богатые

1 ответ

Решение

Я пытался воспроизвести вашу ситуацию на местном уровне. С вашим отображением (используется так же, как фрагмент выше), я смог получить неправильное поведение только на UPDATE, В этом случае ClientID был кэширован, и в то время как Client ссылка была изменена, ClientID остался без изменений. В других случаях кэширование работало как ожидалось.

Решение состоит в том, чтобы изменить отображение. Приведенное ниже сопоставление является наиболее подходящим для свойств только для чтения, таких как ClientID. (Я также использую этот подход).

<property name="ClientID" formula="[ClientId]" 
        not-null="true" insert="false" update="false" />

Так что хитрость в formula отображение вместо Column (по умолчанию, когда ничего не указано)

Другие вопросы по тегам