代码之家  ›  专栏  ›  技术社区  ›  Matt

nhibernate查询返回尚未持久化到数据库的更改

  •  0
  • Matt  · 技术社区  · 16 年前

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

    如何让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 回复  |  直到 16 年前
        1
  •  4
  •   Matt    16 年前

    我找到了我需要的:

    session.FlushMode = FlushMode.Commit;
    

    导致此问题的原因是,默认的FlushMode(FlushMode.Auto)有时会在查询之前刷新对数据库的更改,以防止过时的读取。 通过更改为flushmode.commit,它只在调用commit时将更改写入数据库,这符合我的需要。

    谢谢你的帮助Gillyb。

        2
  •  1
  •   gillyb    16 年前

    在会话中所做的所有更改在整个会话中都是持久的。因此,在会话内部,无法知道会话早期更改了哪些数据,以及哪些数据与数据库模式匹配。

    您可以尝试通过打开两个不同的会话来解决这个问题。在其中一种情况下,不要做任何改变,然后你就会永远知道你从什么开始。

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