2012-03-14 106 views
0

我想映射一个Person对象。在NHibernate中将两个一对多关系映射到一个集合中

我得到PeoplePersonId,FatherIdMotherId字段(等)。最后两个参考文献PersonId在同一张表中。

在我的域模型,我想有一个Children只读集合与所有其他Person将其具有的FatherIdMotherId于母公司的PersonId。要做到这一点

一种方法是使用两个HasMany和地图分别以FatherIdMotherId外键进入FathersChildrenMothersChildren集合并返回那些在Children吸气取决于父母的性别之一。但是,这让我的领域对象变得丑陋,可以这么说。

有什么办法可以解决这个问题吗?我会很高兴与流利或hbm。

+0

只是一个想法:您可以使用IGetter/ISetter的实现将FatchersChildren和MothersChildren映射为虚拟属性,以*将列表*或*设置为取决于性别*的列表。这是你需要的一些额外的代码 – Firo 2012-03-15 11:09:33

回答

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); 
    } 
} 

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

相关问题