FluentNHibernate。我需要将hasmany关系映射到连接的子类实体类型

时间:2010-08-22 10:57:18

标签: nhibernate fluent-nhibernate nhibernate-mapping

我试图让这个FluentNHibernate映射工作。我有三个表Person,Employee和Employer。 Employee表扩展了Person表的属性,它的主键是Person表的外键。

Employee表还有一个Empireyer表的foriegn键。雇主可以拥有许多雇员,每个雇员都是一个人。

我使用FluentNHibernate来映射这三个表。我为Employee使用了一个Joined Subclass映射 - >人

我正在努力让映射工作,以便我可以获得雇主及其相关员工(急切的提取),但生成的select语句选择两者上的EmployerId Employee表(好)和Person表(坏)导致错误(见下文)。

选择 employees0_.EmployerId 作为Employee5_2_,employees0_。 PersonId为PersonId2_,employees0_.PersonId为PersonId1_1_,employees0_.FirstN ame as FirstName1_1_,employees0_.LastName as LastName1_1_,employees0_1_.PayRat e为PayRate2_1_, employees0_1_.EmployerId 为EmployerId2_1_,employer1_.Employe rdd as EmployerId0_0_,employer1_.Name as Name0_0_ FROM [Person] employees0_ lef t外部联接雇员employees0_1_ on employees0_.PersonId = employees0_1_.Employ eeId在employee0_1_.EmployerId = employer1上留下外联合[雇主]雇主1_ .EmployerId WHERE employees0 .Employee.EmployerId = @ p0; @ p0 = 1

请在下面找到架构,类和Fluent Mappings。我做错了什么?

我为这些表定义了类,如下所示:

public class Person
{
    public int PersonId { get; set; }
    public string PersonClassification { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employer
{
    public int EmployerId { get; set; }
    public string Name { get; set; }
    public IList<Employee> Employees { get; set; }
}

public class Employee : Person
{
    public Employer Employer { get; set; }
    public decimal PayRate { get; set; }

}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.PersonId).Column("PersonId").GeneratedBy.Identity();
        Map(x => x.FirstName);
        Map(x => x.LastName);
        DiscriminateSubClassesOnColumn("PersonClassification");
    }
}

public class EmployeeMap : SubclassMap<Employee>
{
    public EmployeeMap()
    {
        this.DiscriminatorValue("Employee");

        Join
            (
                "Employee",
                join =>
                {
                    join.Optional();
                    join.KeyColumn("EmployeeId");
                    join.Map(x => x.PayRate);
                    join.References(x => x.Employer).Column("EmployerId");
                }
            );
    }
}

public class EmployerMap : ClassMap<Employer>
{
    public EmployerMap()
    {
        Id(x => x.EmployerId).Column("EmployerId").GeneratedBy.Identity();
        Map(x => x.Name);
        HasMany(x => x.Employees).KeyColumn("Employee.EmployerId");
    }
}

0 个答案:

没有答案