NHibernate查询返回尚未持久保存到数据库的更改

时间:2010-07-23 09:22:38

标签: nhibernate .net-3.5

以下单元测试失败,我对我检索到的对象进行了更改,然后在同一会话中进行查询,该查询似乎考虑了我对该对象所做的未经修改的更改。

如何让NHibernate忽略任何未经修改的更改并仅查询数据库?

[Test]
public void Test()
{
    // Arrange
    Area area1 = new Area { Name = "Area 1" };
    Area area2 = new Area { Name = "Area 2" };
    using (ISession session = SessionFactory.OpenSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            session.Save(area1);
            session.Save(area2);
            transaction.Commit();
        }
    }
    int resultCount;

    // Act
    using (ISession session = SessionFactory.OpenSession())
    {
        Area existingArea;
        using (var transaction = session.BeginTransaction())
        {
            existingArea = session.Get<Area>(area1.ID);
        }

        existingArea.Name = area2.Name;

        using (var transaction = session.BeginTransaction())
        {
            resultCount = session.CreateCriteria<Area>().Add(Restrictions.Eq("Name", existingArea.Name)).List<Area>().Count;
        }
    }

    // Assert
    Assert.AreEqual(1, resultCount);
}

2 个答案:

答案 0 :(得分:4)

我找到了我需要的东西:

session.FlushMode = FlushMode.Commit;

问题是由于默认FlushMode(FlushMode.Auto)有时会在查询之前刷新对数据库的更改以防止过时读取。 通过更改为FlushMode.Commit,它只会在调用适合我需要的提交时将更改写入数据库。

感谢你帮助gillyb。

答案 1 :(得分:1)

您在会话中所做的所有更改在整个会话期间都是持久的。因此,在会话中,无法知道会话中先前更改了哪些数据以及哪些数据与数据库架构匹配。

您可以尝试通过打开两个不同的会话来解决此问题。在其中一个中不做任何更改,然后你总会知道你最初的用途。

...或者,如果应用程序中有特定位置需要进行历史记录跟踪,我会创建某种历史记录表,您可以将每个更改保存到要跟踪的特定项目。我认为这个解决方案将是最好的,但是,这一切都取决于您的具体需求。