Неправильный компонент при запросе сразу после вставки с помощью NHibernate - PullRequest
1 голос
/ 05 апреля 2010

У меня есть следующее сопоставление для моей таблицы в MySql:

<class name="Tag, namespace" table="tags" >
 <id name="id" type="Int32" unsaved-value="0">
   <generator class="native"></generator>
 </id>
 <property name="name" type="String" not-null="true"></property>
 <component name="record_dates" class="DateMetaData, namespace" >
   <property name="created_at" type="DateTime" not-null="true"></property>
   <property name="updated_at" type="DateTime" not-null="true"></property>
 </component>
</class>

Как видите, свойство record_dates определяется как поле компонента типа DateMetaDate. Поля create_at и updated_at в таблице тегов обновляются с помощью триггеров. Таким образом, я могу вставить новую запись, например:

var newTag = new Tag() 
{ 
 name = "some string here"
}

Int32 id = (Int32)Session.Save(tag);
Session.Flush();

ITag t = Session.Get<Tag>(id);
ViewData["xxx"] = t.name; // -----> not null
ViewData["xxx"] = t.record_dates.created_at; // -----> is null

Однако при запросе той же записи обратно сразу после ее вставки поле record_dates обнуляется, хотя в таблице эти поля имеют значения.

Может ли кто-нибудь указать, почему Session.Get игнорирует возврат всего со стола? это потому, что он кэширует вновь созданную запись, для которой records_dates имеет значение null? Если так, как можно сказать игнорировать кэшированную версию?

Ответы [ 3 ]

0 голосов
/ 05 апреля 2010

Единственное, что я до сих пор нашел, - это вызов Session.Clear() метода для объекта сеанса NHibernate, который, я думаю, заставляет NHibernate снова извлечь запись из таблицы.Но я боюсь, что он удаляет все в кеше и поэтому неэффективен.

0 голосов
/ 05 апреля 2010

Вы можете вызвать ISession.Refresh(obj) для принудительной перезагрузки объекта из базы данных. Насколько я понимаю, это не обновит все отношения, поэтому, если вам нужно перезагрузить полный граф объектов, позвоните ISession.Evict(obj), а затем ISession.Get(id), чтобы удалить его из кэша и перезагрузить его.

0 голосов
/ 05 апреля 2010

Попробуйте использовать lazy = "false" в теге вашего класса:

<class name="Tag, namespace" table="tags" lazy="false">

Насколько мне известно, по умолчанию используется отложенная загрузка, которая может не обновлять ваши объекты по мере необходимости.

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