Определите, изменилось ли поле сущности в NHibernate

У меня есть вызов, который должен определить, изменилось ли поле. Но вызов get с использованием этого идентификатора объекта возвращает тот же объект, а не предыдущую версию.

Entity e = Dao.Get(id);
//At this point e.Field is X
e.Field = y;
Dao.Save(e);

Entity Dao.Get(Guid id)
{
  return Session.Get(id);
}

Entity Dao.Save(Entity e)
{
   Entity olde = Session.Get(e.Id);
   if (e.Field != olde.Field) <--- e.Field == olde.Field so it does not run.
     DoBigMethod(e);
   return e;
}

Как мне справиться с этой ситуацией, не добавляя метод onChange в класс Entity.


person Thad    schedule 09.04.2009    source источник


Ответы (1)


Вы знаете только одну «версию» сущности: текущую. На самом деле существует только одна версия объекта. Он у вас в памяти и вы его уже изменили и забыли предыдущее состояние.

Вызов get, чтобы увидеть предыдущее состояние базы данных, опасен. Если изменения уже сброшены (например, NHibernate сбрасывается перед запросами), вы получите свои изменения. Если вы откроете другой сеанс, вы увидите изменения из других транзакций.

Вас интересует только одно поле? Затем вы можете кэшировать старое значение где-нибудь.

Если это не сработает, вам нужно рассказать мне больше о причине, по которой вам нужно знать предыдущее значение этого поля.

РЕДАКТИРОВАТЬ:

Еще несколько идей:

  • кешировать предыдущее состояние поля при получении объекта в DAO.Get
  • реализовать это свойство, которое устанавливает флаг, если оно изменилось.
  • рассмотрите возможность сделать это изменение явной операцией, вызываемой клиентом, а не неявной операцией, которая вызывается при изменении флага. Например, если этот флаг называется «Активирован», реализуйте метод «Активировать» и «Деактивировать». Эти методы изменяют этот флаг и выполняют «большой набор кода». Флаг доступен только для чтения для остального мира.
person Stefan Steinegger    schedule 22.04.2009
comment
У нас есть флаг для пользователя, который, если он изменится, запускает большой набор кода. Этот код будет генерировать исключения в определенных случаях. Мне не нужно делать эту проверку, если они просто обновляют другие поля. Исключения в этих случаях были бы маловероятны. - person Thad; 22.04.2009
comment
Я добавил еще несколько идей в свой ответ. Надеюсь, поможет. - person Stefan Steinegger; 23.04.2009