【问题标题】:NHibernate mapping class with attribute of same type具有相同类型属性的 NHibernate 映射类
【发布时间】:2017-04-04 03:33:04
【问题描述】:

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

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

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

现在我遇到了休眠映射问题。起初我尝试了一对一的映射。我创建了新实例并且不设置 Childs ,将其持久化(假设 Id=1),并将此实例传递给 View,我预计 RightChild 将为 NULL 而 LeftChild 将为 NULL。但在调试模式下,我可以看到,RightChild 设置为 MyClass,Id=1(就像 MyClass 实例将自身设置为此属性一样),与 LeftChild 相同。

映射 MyClass.hbm.xml

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

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

【问题讨论】:

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


    【解决方案1】:

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

    只需将其视为对其他实例(CountryCurrency)的标准引用......它偶然属于同一类型。

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

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

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

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

    one-to-one 不适合在这里,因为它需要两个表,(几乎)行数相同,共享相同的列作为键...我喜欢使用它,但对于 其他信息...参见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-16
      • 2021-04-19
      • 2023-03-25
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      相关资源
      最近更新 更多