2010-07-23 65 views
0

下面的单元测试失败的变化,我修改,我已经收回,然后在同一个会议上,我做这似乎考虑到未提交更改我的查询对象已经对该物体做出了决定。NHibernate的查询返回尚未保存到数据库

我怎样才能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); 
} 

回答

4

我发现我所需要的:

session.FlushMode = FlushMode.Commit; 

的问题造成的,因为默认FlushMode(FlushMode.Auto)将查询之前的数据库有时冲洗改变,以防止陈旧读取。 通过更改为FlushMode.Commit,它仅在调用提交时才将更改写入数据库,这符合我的需要。

感谢您的帮助gillyb。

+0

(+1)让我多谢你!我也不知道,而且我相信这会在未来帮助我知道。 – gillyb 2010-07-23 10:28:27

+0

btw - 你是从哪里读到的? – gillyb 2010-07-23 10:28:48

+0

我输入'会话'。在Visual Studio中,然后滚动浏览自动完成列表寻找突出的事物。阅读FlushMode.Auto的帮助文本工具提示已将其发送出去。 – Matt 2010-07-23 10:47:56

1

您在会话中所做的所有更改都在会话中保持不变。因此,在会话中,无法知道会话中早些时候更改了哪些数据以及哪些数据与数据库模式匹配。

您可以尝试通过打开两个不同的会话来解决此问题。其中一个不做任何改变,然后你总是知道你从什么时候开始。

...或者,是否有你需要的历史跟踪应用程序特定的斑点,我会创造某种历史表,在那里你节省每一改变要跟踪某些项目。我认为这个解决方案将是最好的,但是再次,这完全取决于你的具体需求。

+0

感谢您的回应,我在ASP.NET应用程序中使用了这个功能,并且我为每个请求打开了一个会话。参考代码示例,我获取existingArea,然后从表单元素中读取值。然后,我执行一个查询,以确保我不会将值更改为与任何其他区域(名称必须唯一)冲突的任何内容。多个会话不是一个选项,并且没有必要进行历史跟踪(至少在这种情况下)。我并不特别需要知道会话中发生了什么变化,我只需要查询即可直接访问数据库。 – Matt 2010-07-23 10:16:52

+0

我不知道我是否理解正确 - 但也许您可以将Area对象克隆为新对象,然后在对其进行更改时,可以将更改之前的对象与克隆对象进行比较。如果您在Area对象上实现IClonable和IComparable,那么在整个代码中这将非常容易。 – gillyb 2010-07-23 10:20:11

相关问题