Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate:从集合与关联和级联样式中删除_Nhibernate - Fatal编程技术网

NHibernate:从集合与关联和级联样式中删除

NHibernate:从集合与关联和级联样式中删除,nhibernate,Nhibernate,我很难理解NHibernate如何知道从关联中删除的对象(然后执行像delete-orphant这样的级联样式)。我的意思是,在数据库级别,如果我想删除关联,我必须物理登录并删除一些FK。NH世界是如何发生这种情况的?我是否重新映射了我的类,删除了以前建立的父/子关联(关系),NH是否进行了比较分析,是否发现某些内容已经更改,然后采取了适当的措施?在Ayende中,他谈到了不同的级联样式和delete或描述为“……除此之外,当一个对象从关联中删除,而不是与另一个对象关联(孤立)时,也删除它……”

我很难理解NHibernate如何知道从关联中删除的对象(然后执行像delete-orphant这样的级联样式)。我的意思是,在数据库级别,如果我想删除关联,我必须物理登录并删除一些FK。NH世界是如何发生这种情况的?我是否重新映射了我的类,删除了以前建立的父/子关联(关系),NH是否进行了比较分析,是否发现某些内容已经更改,然后采取了适当的措施?在Ayende中,他谈到了不同的级联样式和delete或描述为“……除此之外,当一个对象从关联中删除,而不是与另一个对象关联(孤立)时,也删除它……”这种删除是如何发生的

NHibernate监视NHibernate会话中对象所拥有的所有映射集合。在进行更改(添加/删除)时,NHibernate会将其标记为脏。当需要刷新更改时,它会比较脏集合中的元素,并能够识别添加和删除了哪些项。根据集合的级联选项,NHibernate可能会将这些更改持久化到数据库中

这就是为什么您应该始终使用接口(IList、ISet等)声明集合属性,并且永远不要替换使用NHibernate加载的对象上的集合属性

评论中要求的其他信息:

Fabio Maulo(NHibernate首席开发人员)对集合映射进行了有益的讨论,我强烈建议大家阅读。但试着为你的问题提供一个简短的答案:

但NH如何知道对象之间的关联已被删除

通常,当在OO模型中处理多个关联时,我们在父级管理关系。也就是说,当子项位于父项集合中时,它被视为与父项关联。例如

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.