在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映射为虚拟属性,以根据性别确定列表或设置列表。这是您需要的一些额外代码