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

Posted

技术标签:

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

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

我有一个类,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"/>
...

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

【问题讨论】:

【参考方案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 不适合在这里,因为它需要两个表,(几乎)行数相同,共享相同的列作为键...我喜欢使用它,但对于 其他信息...参见:

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

【讨论】:

以上是关于具有相同类型属性的 NHibernate 映射类的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 Fluent NHibernate 不要映射类属性

操作方法:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?

NHibernate:投影和引用类型属性

nHibernate:如何映射可以是任何类型的属性?

在 NHibernate 中使用字符串枚举 - GetValue 永远不会被解雇

Nhibernate 类映射和级联属性