Определите, изменилось ли поле сущности в NHibernate - PullRequest
4 голосов
/ 09 апреля 2009

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

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.

1 Ответ

1 голос
/ 22 апреля 2009

Вам известна только одна «версия» сущности: текущая. Там есть на самом деле только одна версия сущности. У вас есть это в памяти, вы уже изменили его и забыли предыдущее состояние.

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

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

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

EDIT:

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

  • кэширует предыдущее состояние поля при получении объекта, в DAO.Get
  • реализовать это свойство, чтобы оно устанавливало флаг, если оно изменилось.
  • рассмотрите возможность сделать это изменение явной операцией, вызываемой клиентом, вместо неявной операции, которая вызывается при изменении флага. Например, если этот флаг называется «Активирован», реализуйте методы «Активировать» и «Деактивировать». Эти методы изменяют этот флаг и выполняют «большой набор кода». Флаг доступен только для чтения для всего остального мира.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...