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

NHibernate mapping class with attribute of same type

我是 .NET MVC 的新手。但是,我遇到的这个 "problem" 看起来很常见,我找不到任何说明如何正确执行此操作的教程或 Whosebug 线程。

我有一个 class, 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。但是在调试模式下我可以看到,RightChild 被设置为 MyClass with Id=1(就像 MyClass 实例将自己设置为此属性)并且与 LeftChild 相同。

映射MyClass.hbm.xml

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

一对一的方法是正确的还是我应该使用其他方法?

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

简单地将其视为对其他实例的标准引用 (Country, Currency)...类型。

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

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

我的意思是,与类似的映射进行比较:parent-child(也是相同类型)。在那种情况下,我们将有 child 引用 parent,并且 parent 有 children 的集合。

但这里不一样..再次..我们只映射关系的一侧。

A one-to-one 在这里不是 suitable,因为它需要两个 table,具有(几乎)相同的行数,共享相同的列作为键。 . 我喜欢使用它,但对于某种 附加 信息...请参阅:

  • NHibernate Dynamic Columns Number
  • NHibernate Optional Join generates insert instead of update