使用 NHibernate,我通常使用 Get() 或 Load() 方法查询单个记录(取决于我是否需要代理):
SomeEntity obj = session.Get<SomeEntity>(new PrimaryKeyId(1));
现在,如果我执行此语句两次,如下例所示,我只看到在我的单元测试中执行了一个查询:
SomeEntity obj1 = session.Get<SomeEntity>(new PrimaryKeyId(1));
SomeEntity obj2 = session.Get<SomeEntity>(new PrimaryKeyId(1));
到目前为止,一切都很好。但是当使用 ICriteria 查询获取相同的对象时,我注意到一些奇怪的行为。在下面查看我的代码:我得到了第一个对象实例。然后我将一个属性的值更改为 10(数据库中的值为 8),获取另一个实例,最后检查第二个对象实例的值。
//get the first object instance.
SomeEntity obj1 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//the value in the database and the property is 8 at this point. Let's set it to 10.
obj1.SomeValue = 10;
//get the second object instance.
SomeEntity obj2 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();
//check if the values match.
Assert.AreEqual(8, obj2.SomeValue);
现在,由于某种原因,断言失败,因为值是 obj2 的 10,即使我使用新查询请求对象。有趣的是,根据我的单元测试输出窗口执行了 2 个完全相同的选择查询。我的问题:如果从一级缓存中获取第二个对象,为什么会执行 2 个查询?
我错过了什么还是这是一个错误?
问候,特德
编辑 #1:使用 NHibernate v2.1.2GA 编辑 #2:我在最后一段中添加了一些关于正在执行的 2 个查询的额外解释。