流利的nHibernate保存null id - 留下孤儿

时间:2010-06-21 09:51:29

标签: .net nhibernate fluent

我正在目睹Fluent nHibernate的一些奇怪行为。我有两个涉及此问题的对象:“页面”对象和“元数据”对象。页面可以附加多个元数据对象,因此映射完成:

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

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

单步执行代码并观察数据我将错误跟踪到我正在使用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 个答案:

答案 0 :(得分:1)

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

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

我不知道NH为什么会保存一个空外键。你是否在某处将外键设置为null?您是否正在尝试“重复使用”您的实例以获取其他内容?

相关问题