我目睹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
因此,显然没有任何数据保存。
任何人都可以对此有所了解吗?这让我疯狂!
干杯, 马特
感谢您 - 非常有帮助的解释。事实证明,我在代码的其他地方创建了新的孤儿对象,并且因为他们没有立即提交给数据库而感到困惑。我怀疑我会发现这个没有你的答案:) – 2010-06-21 10:38:25