NHibernate:从集合与关联和级联样式中删除
我很难理解NHibernate如何知道从关联中删除的对象(然后执行像delete-orphant这样的级联样式)。我的意思是,在数据库级别,如果我想删除关联,我必须物理登录并删除一些FK。NH世界是如何发生这种情况的?我是否重新映射了我的类,删除了以前建立的父/子关联(关系),NH是否进行了比较分析,是否发现某些内容已经更改,然后采取了适当的措施?在Ayende中,他谈到了不同的级联样式和delete或描述为“……除此之外,当一个对象从关联中删除,而不是与另一个对象关联(孤立)时,也删除它……”这种删除是如何发生的 NHibernate监视NHibernate会话中对象所拥有的所有映射集合。在进行更改(添加/删除)时,NHibernate会将其标记为脏。当需要刷新更改时,它会比较脏集合中的元素,并能够识别添加和删除了哪些项。根据集合的级联选项,NHibernate可能会将这些更改持久化到数据库中 这就是为什么您应该始终使用接口(IList、ISet等)声明集合属性,并且永远不要替换使用NHibernate加载的对象上的集合属性 评论中要求的其他信息: Fabio Maulo(NHibernate首席开发人员)对集合映射进行了有益的讨论,我强烈建议大家阅读。但试着为你的问题提供一个简短的答案: 但NH如何知道对象之间的关联已被删除 通常,当在OO模型中处理多个关联时,我们在父级管理关系。也就是说,当子项位于父项集合中时,它被视为与父项关联。例如NHibernate:从集合与关联和级联样式中删除,nhibernate,Nhibernate,我很难理解NHibernate如何知道从关联中删除的对象(然后执行像delete-orphant这样的级联样式)。我的意思是,在数据库级别,如果我想删除关联,我必须物理登录并删除一些FK。NH世界是如何发生这种情况的?我是否重新映射了我的类,删除了以前建立的父/子关联(关系),NH是否进行了比较分析,是否发现某些内容已经更改,然后采取了适当的措施?在Ayende中,他谈到了不同的级联样式和delete或描述为“……除此之外,当一个对象从关联中删除,而不是与另一个对象关联(孤立)时,也删除它……”
child.Parent = parent;
parent.Children.Add(child); // This is the critical bit
session.Save(parent); // to have an INSERT generated here
类似地,从集合中删除项目会中断关联(假设使用了正确的映射属性)
这与关系世界中的工作方式相反,在关系世界中,我们通过子行上的外键管理子级的关系
对于更详细的理解,没有什么比下载NHibernate源代码、创建一个简单的测试用例然后在调试器中单步执行更好的了
“这就是为什么……”背后的原因是什么
在管理关联集合中,NHibernate需要处理很多事情。它通过使用自己的集合类来实现这一点,这些集合类跟踪它们是否脏、从db加载时处于什么状态以及其他一些很酷的东西。如果替换这些对象,则NHibernate将失去该功能。因此,例如,如果要清除集合中的所有项,则应执行以下操作:
parent.Children.Clear(); // The collection object is preserved and NHibernate knows you want them all deleted.
你永远不应该做:
parent.Children = new List<X>(); // NHibernate will not track changes to this collection.
parent.Children=new List();//NHibernate不会跟踪对此集合的更改。
为了进一步阅读,你可能还想看一看 当涉及到从集合中添加/删除项目时,您在第一段中的解释非常有意义。但NH如何知道对象之间的关联已被删除?您还说“这就是为什么您应该始终使用接口声明集合属性…”“这就是为什么…”背后的原因是什么?是因为项被标记为脏项还是数据库的持久性是这里的关键?
parent.Children = new List<X>(); // NHibernate will not track changes to this collection.