Как обойти кэширование NHibernate? - PullRequest
0 голосов
/ 09 декабря 2010

Я новичок в NHibernate и был назначен на задачу, где мне нужно изменить значение свойства объекта, а затем сравнить, отличается ли это новое значение (кэшированное) от фактического значения, хранящегося в БД. Однако каждая попытка получить это значение из БД приводила к кешированному значению. Как я уже сказал, я новичок в NHibernate, возможно, это легко сделать, и, очевидно, это можно сделать с помощью простого ADO.NET, но клиент требует, чтобы мы использовали NHibernate для каждого доступа к БД. Чтобы прояснить ситуацию, это были мои «успешные» попытки (т.е. без ошибок):

1

DetachedCriteria criteria = DetachedCriteria.For<User>()
.SetProjection(Projections.Distinct(Projections.Property(UserField.JobLoad)))
.Add(Expression.Eq(UserField.Id, userid));

return GetByDetachedCriteria(criteria)[0].Id; //this is the value I want

2

var JobLoadId = DetachedCriteria.For<User>()
.SetProjection(Projections.Distinct(Projections.Property(UserField.JobLoad)))
.Add(Expression.Eq(UserField.Id, userid));

ICriteria criteria = JobLoadId.GetExecutableCriteria(NHibernateSession);

var ids = criteria.List();
return ((JobLoad)ids[0]).Id;

Надеюсь, я дал понять, что иногда трудно объяснить проблему, даже если вы не совсем понимаете основную структуру.

Редактировать: Конечно, это тело метода.

Редактировать 2: Я обнаружил, что он не работает должным образом, поскольку вызов метода находится внутри контекста транзакции. Если я удаляю транзакцию, она работает нормально, но мне нужно, чтобы она была в этом контексте.

Ответы [ 4 ]

3 голосов
/ 10 декабря 2010

Я делаю это, открывая новый сеанс без сохранения состояния для получения фактического объекта в базе данных:

 User databaseuser;
 using (IStatelessSession session = SessionFactory.OpenStatelessSession())
                {
                databaseuser =  db.get<User>("id"); 
                }
//do your checks
2 голосов
/ 09 декабря 2010

В течение сеанса NHibernate возвращает тот же объект из своего кэша 1-го уровня (он же Identity Map).Если вам нужно увидеть текущее значение в базе данных, вы можете открыть новый сеанс и загрузить объект в этом сеансе.

0 голосов
/ 10 декабря 2010

Я бы сделал это так:

public class MyObject : Entity
{
   private readonly string myField;

   public string MyProperty 
   { 
     get { return myField; }
     set 
    {
       if (value != myField)
       {
          myField = value;
          DoWhateverYouNeedToDoWhenItIsChanged();
       }
    }
   }
}
0 голосов
/ 10 декабря 2010

googles nhforge

http://nhibernate.info/doc/howto/various/finding-dirty-properties-in-nhibernate.html

Это может помочь вам.

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