NHibernate Session.SetReadOnly - PullRequest
       0

NHibernate Session.SetReadOnly

2 голосов
/ 06 августа 2010

Я сталкиваюсь с той же проблемой, что и другие, уже опубликованные на SO: при чтении объектов из базы данных NHibernate обновляет все объекты, поскольку значение одного поля в БД неверно.

(Вдеталь: недавно добавленный столбец даты содержит «1/1/0001» во всех строках, поэтому при отображении NHibernate заменяет дату и, при tx.Commit (), обновляет каждую строку.)

[ Редактировать: Оказалось, что это неправильно. Вместо этого эти поля даты были нулевыми, но NHibernate обновит их до 1 января 0001 года.Подробности см. В ответе Диего.]

Чтобы предотвратить это, я нашел это сообщение с ответом Бена Шейрмана , а также комментарий в блоге , на который ссылаютсяс помощью OP .

Комментатор Кристиан говорит:

Вы также можете отключить автоматическую проверку и обновление, отключив моментальные снимки в Hibernate с помощью session.setReadOnly (o, true) или для всех запрашиваемых объектов с query.setReadOnly (true).

(обратите внимание, что этот блог посвящен Java Hibernate.)

query.SetReadOnly (true) был успешным, гдеЯ использовал запросы.Тем не менее, у меня также есть код, подобный этому:

ISession session = this.NHibernateHelper.SessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

try
{
    BO resultBO = session.Get<BO>(id);

    tx.Commit();
    return resultBO;
}
catch (Exception ex)
{
    tx.Rollback();
    throw ex;
}
finally
{
    session.Close();
}

В этом случае у меня нет запроса, и указанный Session.SetReadOnly(resultBO, true) не существует в NHibernate. Куда это делось?

Полагаю, "evict" в принципе не очень хорошая идея, потому что он делает объект временным, поэтому я не могу использовать его для обновления значений в другом сеансе (по крайней мере,это усложняется. Мне также нужно убедиться, что все объекты всегда исключены, поэтому моим общим методам обновления не нужно было бы различать постоянные и временные объекты - или я совершенно не прав?

Спасибо и ура, chiccodoro

1 Ответ

5 голосов
/ 06 августа 2010

Вы атакуете симптом вместо болезни.

У вас есть призрак (см. http://jfromaniello.blogspot.com/2010/02/nhibernate-ghostbuster-version-11.html)

Сделайте свойство обнуляемым, и все будет в порядке.

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