我想要映射一个Person
对象。
我的People
表包含PersonId
,FatherId
和MotherId
字段(以及其他字段)。同一个表格中最后两个参考PersonId
。
在我的域模型中,我希望有一个Children
只读集合,其他Person
设置了FatherId
或 {{1父母的MotherId
。
一种方法是使用两个PersonId
并分别使用HasMany
和FatherId
外键映射到MotherId
和FathersChildren
个集合中并返回一个MothersChildren
吸气剂中的那些取决于父母的性别。但是,这使我的域名对象变得丑陋,可以这么说。
有没有办法在映射中解决这个问题?我会很满意流利或者hbm。
答案 0 :(得分:0)
好吧,我正在查看我的模型,并且我发现 NHibernate 需要所有属性virtual
以允许延迟加载。它返回一个具有继承原始类的对象。所以我做了同样的事。
我的域名模型保持不变:
public class Person
{
public virtual Guid Id { get; private set; }
public virtual Gender Gender { get; set; }
public virtual IEnumerable<Person> Children { get; set; }
}
用于映射的实体类:
public class PersonEntity : Person
{
public virtual IList<Person> FatherChildren { get; set; }
public virtual IList<Person> MotherChildren { get; set; }
public override IEnumerable<Person> Children
{
get
{
return Gender == Domain.Gender.Male ? FatherChildren : MotherChildren;
}
}
}
稍微修改了派生类的映射:
public class PersonMap : ClassMap<PersonEntity>
{
public PersonMap()
{
Table("People");
Id(x => x.Id)
.GeneratedBy.Guid();
HasMany<PersonEntity>(x => x.FatherChildren)
.KeyColumn("FatherId")
.Inverse()
.ReadOnly();
HasMany<PersonEntity>(x => x.MotherChildren)
.KeyColumn("MotherId")
.Inverse()
.ReadOnly();
Map(x => x.Gender);
}
}
现在我有一个干净的模特!