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

时间:2012-03-14 20:13:28

标签: hibernate nhibernate fluent-nhibernate

我想要映射一个Person对象。

我的People表包含PersonIdFatherIdMotherId字段(以及其他字段)。同一个表格中最后两个参考PersonId

在我的域模型中,我希望有一个Children只读集合,其他Person设置了FatherId {{1父母的MotherId

一种方法是使用两个PersonId并分别使用HasManyFatherId外键映射到MotherIdFathersChildren个集合中并返回一个MothersChildren吸气剂中的那些取决于父母的性别。但是,这使我的域名对象变得丑陋,可以这么说。

有没有办法在映射中解决这个问题?我会很满意流利或者hbm。

1 个答案:

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

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