Я пытаюсь заставить работать это отображение FluentNHibernate. У меня есть три таблицы Person, Employee и Employer. Таблица Employee расширяет атрибуты таблицы Person, а ее первичный ключ является внешним ключом таблицы Person.
Таблица Employee также имеет внешний ключ к таблице Employer. У работодателя может быть много сотрудников, и каждый сотрудник - это человек.
Я использовал FluentNHibernate для сопоставления этих трех таблиц. Я использовал отображение присоединенного подкласса для Employee -> Person.
Я пытаюсь настроить отображение на работу, чтобы можно было найти работодателей и связанных с ними сотрудников (с нетерпением извлекать информацию), но сгенерированный оператор выбора выбирает EmployerId для обоих таблицы Employee (хорошо), и таблица Person (плохая), приводящая к ошибке (см. ниже).
SELECT employee0_.EmployerId as Employee5_2_, employee0_.
PersonId как PersonId2_, employee0_.PersonId как PersonId1_1_, employee0_.FirstN
ame as FirstName1_1_, employee0_.LastName как LastName1_1_, employee0_1_.PayRat
e как PayRate2_1_, employee0_1_.EmployerId как EmployerId2_1_, Employer1_.Employe
rid as EmployerId0_0_, Employer1_.Name как Name0_0_ FROM [Person] employee0_ lef
t внешнее объединение Employee employee0_1_ on employee0_.PersonId = employee0_1_.Employ
eeId оставил внешнее соединение [Employer] Employer1_ на сотрудников0_1_.EmployerId = Employer1
.EmployerId WHERE сотрудников0.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");
}
}