NHibernate中的逆属性

NHibernate中的逆属性,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,如何使用反向属性?如果我没有弄错的话,对于一对多关系,inverse属性必须设置为true。对于多对多关系,一个实体类反向属性必须设置为true,另一个设置为false 任何人都可以对此有所了解?反向属性不能设置为true 您可以使用反向属性指定关联的“所有者”。(一个关联只能有一个所有者,因此一端必须设置为反向,另一端必须设置为“非反向”)。 (所有者:inverse=false;非所有者:inverse=true) 在一对多关联中,如果不将集合标记为反向端,则NHibernate将执行额外的

如何使用反向属性?如果我没有弄错的话,对于一对多关系,inverse属性必须设置为true。对于多对多关系,一个实体类反向属性必须设置为true,另一个设置为false


任何人都可以对此有所了解?

反向属性不能设置为true

您可以使用反向属性指定关联的“所有者”。(一个关联只能有一个所有者,因此一端必须设置为反向,另一端必须设置为“非反向”)。 (所有者:
inverse=false
;非所有者:
inverse=true

在一对多关联中,如果不将集合标记为反向端,则NHibernate将执行额外的更新。 事实上,在这种情况下,NHibernate将首先插入集合中包含的实体,如有必要,插入拥有集合的实体,然后更新“集合实体”,以便设置外键并建立关联。(请注意,这也意味着数据库中的外键应为空)

当您将集合结束标记为“反向”时,NHibernate将首先持久化“拥有”集合的实体,然后持久化集合中的实体,从而避免使用额外的UPDATE语句

因此,在双向关联中,始终有一个反向端。

此外,根据我的理解,您需要手动在集合中保留外键值,也就是说,如果您不想使用额外的update语句:

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);
<代码>父PAR= session .GET(8); Child ch=新的Child(); ch.Name=“Emad”; //手动设置父外键 CHY MyPalm=PAR; 我的孩子,加上(CH); 会话保存(par); 有关反转属性的进一步解释,请查看以下帖子:

我可以看到“所有者”是从哪里来的,但是关联是一个管道,你可以向下看两端,那么说哪个实体“拥有”管道呢

另一种看待这一点的方式是,在一对多关系中,实际上有两种关系在进行

关系1:许多孩子的父母

关系2:每个孩子与父母的关系

因此,NH将尝试运行sql以在DB中存储这些数据。但不需要这样做,因为当您设置外键时(例如,在关系2中存储子项时),它会自动修复父项与子项的关系,因为关系1是关系2的“反向”

所以,反向的意思是,一旦我们设置了主关系,它就是我们默认得到的东西。i、 e.NH不需要运行sql来修复关系1,通过将子集合标记为反向,NH将在子集合添加到时跳过运行sql


我认为,如果您没有告诉NH这是一个反向关系,那么在sql中尝试并设置反向关系也会浪费精力,即使它不需要这样做。

这就解释了为什么只添加所有者就是一个在表中有外键的所有者在我看来,这是一个非常糟糕的术语。为什么不标记所有权而不是“反向”+1对于在已经被否定的术语上使用否定:)“逆属性不能设置为true”回答得很好,剩下的唯一问题是如何决定谁应该是“所有者”当您有一个包含两个实体之间关系的中间表时,多对多如何?您也可以在类似的问题上检查我的答案“”。