Почему NHibernate не удаляет сущности из кэша 2-го уровня при их обновлении? - PullRequest
0 голосов
/ 11 августа 2011

Я использую SysCache2 и NHibernate 2.1.2.4.

Как бы я ни старался, NHibernate продолжает загружать предыдущие экземпляры объекта.

Мой класс отображается как кэшируемый ReadWrite.

По умолчанию используется область кэша, то есть полное имя типов класса.

Я выполняю все действия внутри транзакции.

База данных определенно обновляется,и когда я вручную очищаю кеш ASP .NET, проблема исчезает.

Я делаю простое обновление, например:

using(var transaction = NHSession.BeginTransaction())
{
    var foo = Session.Load<Foo>(_fooId);

    foo.Name = "A new name";

    transaction.Commit();
}

Затем я перезагружаю сущность позже (вдругой сеанс в приложении), например:

using(var transaction = NHSession.BeginTransaction())
{
    var foo = Session.Load<Foo>(_fooId);

    Response.Write(foo.Name);

    transaction.Commit();
}

... но имя Фу все еще старое, а не новое, я просто обновил его до!

Ответы [ 3 ]

1 голос
/ 12 августа 2011

Я работал над этим - по определенным причинам у меня было две сессионные фабрики.Я не осознавал, что операция сохранения выполнялась на одном заводе, а загрузка происходила на другом.

1 голос
/ 11 августа 2011

Я бы регистрировал все сообщения, связанные с кэшированием, и смотрел, обновляется ли кэш при фиксации 2-й транзакции. Вот пример конфигурации log4net для регистрации сообщений кэширования ... </p> <pre><code><logger name="NHibernate.Cache.ReadWriteCache" additivity="false"> <level value="ALL"/> <appender-ref ref="Console"/> </logger>

0 голосов
/ 12 августа 2011

Почему вы используете Load вместо Get? Я подозреваю, что это как-то связано с проблемой. Эта статья объясняет различия, но не имеет отношения к вашей проблеме. Тем не менее, я бы попробовал перейти на Get.

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