具有相同类型属性的 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
映射。
只需将其视为对其他实例(Country,Currency)的标准引用......它偶然属于同一类型。
<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 映射类的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 Fluent NHibernate 不要映射类属性
操作方法:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?