我试图让这个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");
}
}