FluentNHibernate. Мне нужно отобразить отношение hasmany к типу сущности присоединенного подкласса - PullRequest
2 голосов
/ 22 августа 2010

Я пытаюсь заставить работать это отображение 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");
    }
}
...