具有相同类型属性的NHibernate映射类

时间:2016-11-20 19:16:54

标签: asp.net-mvc inheritance nhibernate mapping nhibernate-mapping

我是.NET MVC的新手。然而,这个"问题"我看起来很常见,我找不到任何教程或stackoverflow线程,解释如何正确地做到这一点。

我有一个类,MyClass有两个相同类型的属性

 public class MyClass : IEquatable<MyClass>
 {
     public virtual MyClass LeftChild { get; set; }
     public virtual MyClass RightChild { get; set; }
     ...
 }

现在我遇到了nhibernate映射的问题。起初我尝试了一对一的映射。我创建了新实例并且没有设置Childs,持久化它(假设Id = 1),并将此实例传递给View,我预计RightChild将为NULL,LeftChild将为NULL。但是在debbug模式中,我可以看到,RightChild设置为MyClass,Id = 1(类似于MyClass实例将自己设置为此属性),与LeftChild相同。

映射MyClass.hbm.xml

...    
<one-to-one name="LeftChild" class="MyClass"/>
<one-to-one name="RightChild" class="MyClass"/>
...

一对一的做法是正确的做法还是我应该使用别的东西?

1 个答案:

答案 0 :(得分:1)

我们的表包含外键的引用几乎总是最好用many-to-one映射。

只需将其视为对其他实例(国家货币)的标准引用...这是偶然的相同类型。

<many-to-one name="LeftChild"  column="LeftChild_ID"  class="MyClass"/>
<many-to-one name="RightChild" column="RightChild_ID" class="MyClass"/>

我看到的唯一挑战是确保服务器部分(C#代码,应用程序)正确设置这些值。这种持久化信息中没有双向映射。每个兄弟都需要自己的信息,谁是谁的权利。

我的意思是,与相似的映射比较:父子(也是相同的类型)。在这种情况下,我们将有孩子参考父母,父母有孩子的集合。

但是这里的情况不一样了......我们只是映射关系的一面。

one-to-one在这里不合适,因为它需要两个表,(几乎)相同的行数,共享相同的列...我喜欢使用它,但是对于< strong>附加信息...请参阅: