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

查询前刷新?

  •  1
  • Chris  · 技术社区  · 15 年前

    我有一个使用nhibernate会话将对象持久化到数据库的repository类。默认情况下,存储库不使用显式事务—由调用方管理。我有以下单元测试来测试我的NHibernate管道:

    [Test]
    public void NHibernate_BaseRepositoryProvidesRequiredMethods()
    {            
        using (var unitOfWork = UnitOfWork.Create())
        {
            // test the add method
            TestRepo.Add(new TestObject() { Id = 1, Name = "Testerson" });
            TestRepo.Add(new TestObject() { Id = 2, Name = "Testerson2" });
            TestRepo.Add(new TestObject() { Id = 3, Name = "Testerson3" });
    
            // test the getall method
            var objects = TestRepo.GetAll();
            Assert.AreEqual(3, objects.Length);
    
            // test the remove method
            TestRepo.Remove(objects[1]);
            objects = TestRepo.GetAll();
            Assert.AreEqual(2, objects.Length);
    
            // test the get method
            var obj = TestRepo.Get(objects[1].Id);
            Assert.AreSame(objects[1], obj);
        }
    }
    

    问题是这条线

    Assert.AreEqual(3, objects.Length);
    

    测试失败,因为从 GetAll 方法为空。如果在插入三个对象之后立即手动刷新会话,则测试的这一部分将通过。我在会话中使用默认的flushmode,根据文档,它应该在运行查询检索所有对象之前刷新,但显然不是。我错过了什么?

    编辑:我在单元测试场景中使用sqlite,如果这有什么不同的话。

    1 回复  |  直到 15 年前
        1
  •  3
  •   hackerhasid    15 年前

    你说

    根据文档,它应该在运行查询以检索所有对象之前刷新

    但是医生 https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html ,文档声明在自动刷新模式下(强调是我的):

    会议是 有时脸红 在执行查询之前 确保查询不会返回过时的 状态。这是默认的刷新模式。

    所以,在期望这些值显示在您的选择中之前,您需要刷新以保存这些值。