NHibernate中的反转属性

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

任何人都可以点亮这个灯?

反转属性不能设置为true …

您使用inverse属性来指定关联的“所有者”。 (一个关联只能拥有一个所有者,所以一端必须被设置为反转,另一端必须被设置为“不反转”)。 (所有者: inverse=false ;非owner: inverse=true

在一对多关联中,如果你不把这个集合标记为反向结束,那么NHibernate将执行一个额外的UPDATE。 实际上,在这种情况下,NHibernate将首先插入集合中包含的实体,如果有必要,插入拥有集合的实体,然后更新“集合实体”,以便设置外键,并且关联被制成。 (注意,这也意味着数据库中的外键应该是空的)。

当你将collection的结束标记为'inverse'时,NHibernate将首先持续拥有这个集合的实体,然后持久化这个集合中的实体,避免额外的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); 

为了进一步解释inverse属性,请检查以下内容:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/

我可以看到“所有者”在哪里进来,但是一个关联是一个pipe道,你可以往下看,那么说什么实体“拥有”pipe道。

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

关系1:许多孩子的父母。

关系2:每个孩子的父母

所以NH会尝试运行sql来将这些数据存储在数据库中。 但是这并不需要,因为当你设置外键的时候,例如在关系2中,当一个孩子被存储的时候,它自动地固定了父母与孩子的关系,因为关系1是关系2的“逆” 。

所以反向的意思是,一旦我们确定了主要关系,就是我们默认得到的东西。 即不需要NH来运行sql来修复关系1,并且通过将子集合标记为反向NH将在添加子集合时跳过正在运行的sql。

我假设,如果你没有告诉NH它是一个反过来,那么它会浪费在做sql的努力尝试和设置相反的关系 – 即使它不需要。

Interesting Posts