Определете дали поле на обект е променено в NHibernate

Имам обаждане, което трябва да определи дали дадено поле е променено. Но извикването на get using that entities 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.


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


Отговори (1)


Вие знаете само една „версия“ на обекта: текущата. Всъщност има само една версия на обекта. Имате го в паметта и вече сте го променили и сте забравили предишното състояние.

Обаждането, за да видите предишното състояние на базата данни, е опасно. Ако промените вече са изтрити (NHibernate изтрива преди заявки например), вие получавате вашите промени. Ако отворите друга сесия, виждате промени от други транзакции.

Интересувате ли се само от една единствена област? След това можете да кеширате старата стойност някъде.

Ако това не работи, трябва да ми кажете повече за причината, поради която трябва да знаете предишната стойност на това поле.

РЕДАКТИРАНЕ:

Още няколко идеи:

  • кеширайте предишното състояние на полето, когато получите обекта, в DAO.Get
  • прилага това свойство, че задава флаг, ако се промени.
  • обмислете да направите тази промяна явна операция, извикана от клиента, вместо неявна операция, която се извиква, когато флагът се промени. Например, ако този флаг се нарича „Активиран“, приложете метод „Активиране“ и „Деактивиране“. Тези методи променят този флаг и изпълняват "големия набор от код". Флагът е само за четене за останалия свят.
person Stefan Steinegger    schedule 22.04.2009
comment
Имаме флаг за потребител, който, ако се промени, изпълнява голям набор от код. Този код ще хвърля изключения в определени случаи. Не е необходимо да правя тази проверка, ако те просто актуализират други полета. Изключения в тези случаи са малко вероятни. - person Thad; 22.04.2009
comment
Добавих още няколко идеи към отговора си. Дано помогне. - person Stefan Steinegger; 23.04.2009