在NHibernate中将两个一对多关系映射到一个集合

在NHibernate中将两个一对多关系映射到一个集合,hibernate,nhibernate,fluent-nhibernate,Hibernate,Nhibernate,Fluent Nhibernate,我想映射一个人对象 我有People表,其中包含PersonId、FatherId和MotherId字段(以及其他字段)。最后两个参考PersonId位于同一个表中 在我的域模型中,我希望有一个Children只读集合,每个人都将其父亲ID或母亲ID设置为父母的个人ID 一种方法是使用两个HasMany并分别使用FatherId和MotherId外键映射到fathershildren和mothershildren集合中,并根据父母的性别返回Childrengetter中的一个。但可以说,这让我的

我想映射一个
对象

我有
People
表,其中包含
PersonId
FatherId
MotherId
字段(以及其他字段)。最后两个参考
PersonId
位于同一个表中

在我的域模型中,我希望有一个
Children
只读集合,每个
人都将其
父亲ID
母亲ID
设置为父母的
个人ID

一种方法是使用两个
HasMany
并分别使用
FatherId
MotherId
外键映射到
fathershildren
mothershildren
集合中,并根据父母的性别返回
Children
getter中的一个。但可以说,这让我的域对象很难看


有没有什么方法可以在映射中解决这个问题?我很乐意使用fluent或hbm。

好吧,我正在查看我的模型,我发现NHibernate需要所有属性都是
虚拟的
,以允许延迟加载。它返回一个对象,该对象包含从原始对象继承的类。所以我也这么做了

我的域模型保持不变:

公共类人物
{
公共虚拟Guid Id{get;private set;}
公共虚拟性别性别{get;set;}
公共虚拟IEnumerable子项{get;set;}
}
用于映射的实体类:

公共类个人性:个人
{
公共虚拟IList父级子级{get;set;}
公共虚拟IList母子项{get;set;}
公共子对象数
{
得到
{
return-Gender==Domain.Gender.Male?父子:母子;
}
}
}
对于派生类,映射稍有修改:

公共类PersonMap:ClassMap
{
公众人物地图()
{
表(“人员”);
Id(x=>x.Id)
.GeneratedBy.Guid();
有许多(x=>x.父子)
.KeyColumn(“父辈”)
.Inverse()
.ReadOnly();
有很多(x=>x个母子)
.KeyColumn(“MotherId”)
.Inverse()
.ReadOnly();
Map(x=>x.Gender);
}
}

现在我有了一个干净的模型

这只是一个想法:您可以使用IGetter/ISetter实现将FatchersChildren和MothersChildren映射为虚拟属性,以根据性别确定列表或设置列表。这是您需要的一些额外代码