如何使用反向属性?如果我没有弄错,对于一对多关系,inverse属性必须设置为true。对于多对多关系,其中一个实体类逆属性必须设置为true,另一个设置为false。
任何人都可以对此有所了解吗?
答案 0 :(得分:119)
不能将inverse属性设置为true ...
使用inverse属性指定关联的“所有者”。 (关联只能有一个所有者,因此必须将一端设置为反向,另一端必须设置为“非反向”)。
(所有者:inverse=false
;非所有者:inverse=true
)
在一对多关联中,如果不将集合标记为反向结束,则NHibernate将执行额外的更新。 实际上,在这种情况下,NHibernate将首先插入集合中包含的实体,如果需要,插入拥有集合的实体,然后更新“集合实体”,以便设置外键和关联是。 (请注意,这也意味着数据库中的外键应该可以为空)。
当您将集合结束标记为“反向”时,NHibernate将首先保留“拥有”该集合的实体,并在之后保留集合中的实体,从而避免使用额外的UPDATE语句。
因此,在双向关联中,你总是有一个反向结束。
答案 1 :(得分:9)
除the answer above之外,根据我的理解,您需要手动将外键值保留在集合中,即如果您不想要额外的更新语句:
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);
有关inverse属性的进一步说明,请查看以下帖子:
http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/
答案 2 :(得分:2)
我可以看到“所有者”的位置,但是关联是一个管道,你可以向下看两端,所以说什么实体“拥有”管道。
另一种看待这种情况的方式是,在一对多关系中,实际上存在两种关系。
关系1:许多孩子的父母。
关系2:每个孩子都是父母
因此NH将尝试运行sql将其中的每一个存储在数据库中。但它不需要,因为当您设置外键时,例如在关系2中存储子项时,它会自动修复父项与子项的关系,因为关系1是关系2的“反向”。
所以反过来意味着,一旦我们设置了主要关系,它就会被默认获得。即,不需要NH运行sql来修复关系1,并将子集合标记为反向NH将在添加子集合时跳过运行sql。
我认为如果你没有告诉NH它是反向的,那么它会浪费精力去做sql尝试设置反向关系 - 即使它不需要。 / p>