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
(по умолчанию, когда ничего не указано)