如何解决NHibernate缓存问题?

时间:2010-12-09 18:17:19

标签: nhibernate

我是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 个答案:

答案 0 :(得分:3)

我这样做是为了获取数据库中的实际对象而打开一个新的无状态会话:

 User databaseuser;
 using (IStatelessSession session = SessionFactory.OpenStatelessSession())
                {
                databaseuser =  db.get<User>("id"); 
                }
//do your checks

答案 1 :(得分:2)

在一个会话中,NHibernate将从其Level-1 Cache(aka Identity Map)返回相同的对象。如果需要查看数据库中的当前值,可以打开一个新会话并在该会话中加载该对象。

答案 2 :(得分:0)

答案 3 :(得分:0)

我会这样做:

public class MyObject : Entity
{
   private readonly string myField;

   public string MyProperty 
   { 
     get { return myField; }
     set 
    {
       if (value != myField)
       {
          myField = value;
          DoWhateverYouNeedToDoWhenItIsChanged();
       }
    }
   }
}