我正在目睹 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
因此,显然没有任何东西可以保存数据。
任何人都可以对此有所了解吗?它让我发狂!
干杯,马特