0

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

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

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

单步执行代码并查看数据,我将错误跟踪到我使用 nHibernate 获取 Page 对象以使用其详细信息的地步。因此,在我调用此方法之前,数据库根本没有显示任何元数据更改。之后,我看不到数据库(它很忙),但返回的页面有任何添加的元数据。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

因此,显然没有任何东西可以保存数据。

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

干杯,马特

4

1 回答 1

1

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

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

I don't know why NH saves a null foreign key. Are you setting the foreign key to null somewhere? Are you trying to "reuse" your instance for something else?

于 2010-06-21T10:34:44.580 回答