2010-06-21 49 views
0

我目睹Fluent nHibernate的一些奇怪的行为。我有两个对象涉及这个问题:一个“页面”对象和一个“元数据”对象。页面可以连接多个元数据对象,并且映射如此完成:流利的nHibernate保存空id - 叶孤儿

'in PageMap 
HasMany(Function(x) x.MetaData).Cascade.All() 
'in MetaDataMap 
References(Function(x) x.Page) 

问题发生在保存过程中。当我想保存对页面对象的更改时,我得到现有页面对象,运行更改列表,然后使用Session.Update(Page)来保存值。奇怪的行为是数据确实保存,但页面元数据保存两次:一次是预期的,另一次是page_id为空。然而,更奇怪的是,即使我注释掉Update命令时也会发生这种情况 - 所以实际上并不是导致数据保存的更新!

单步执行代码并观察数据我将错误追溯到使用nHibernate获取Page对象以使用其详细信息的点。因此,在我调用此方法之前,数据库根本没有显示任何Metdata更改。之后,我看不到数据库(很忙),但返回的页面有任何添加的元数据。 get方法如下所示:

Public Function GetById(ByVal Id As Integer) As Cms.DataTransferObjects.Page Implements IPageManager.GetById 
    Dim session As ISession = NHibernateSessionManagerStore.Instance.GetSession() 
    Dim results As Cms.DataTransferObjects.Page 

    results = session.CreateCriteria(Of DataTransferObjects.Page)() _ 
     .Add(Expression.Like("Id", Id)) _ 
     .UniqueResult(Of DataTransferObjects.Page)() 

    Return results 
End Function 

因此,显然没有任何数据保存。

任何人都可以对此有所了解吗?这让我疯狂!

干杯, 马特

回答

1

你并不需要调用Update当实例已经在会话。 NHibernate非常聪明,可以找到对对象所做的所有更改并将它们存储到数据库中。要将实例放入会话中,通常使用查询来获取现有对象,或者使用Save来保存新实例。 Update仅适用于分离的实例。

将内存状态写入数据库称为Flush ing。 NH在提交之前刷新,而且在查询之前刷新,以确保查询在实际数据上执行(因此,如果将属性设置为“A”,则可以立即进行查询,以“A”过滤此属性,会得到你的实例)。

我不知道为什么NH保存一个空外键。你是否将外键设置为null?你是否试图“重新使用”你的实例?

+0

感谢您 - 非常有帮助的解释。事实证明,我在代码的其他地方创建了新的孤儿对象,并且因为他们没有立即提交给数据库而感到困惑。我怀疑我会发现这个没有你的答案:) – 2010-06-21 10:38:25