Свободная проблема сопоставления внешнего ключа в NHibernate HasMany - PullRequest
8 голосов
/ 11 мая 2011

Я пытаюсь отобразить простую структуру данных в nhibernate

Таблицы:

Employees
employeeID int
username varchar(30)
departmentID int

Departments
departmentID int
deptName varchar(50)

Мое отображение отдела выглядит так:

public class DepartmentMap: ClassMap<Department>
{
    public DepartmentMap()
    {
        Id(m => m.DepartmentID).Column("departmentID");
        Map(m => m.DepartmentName).Column("deptName").Length(50);

        HasMany(m => m.Employees);

        Table("Departments");
    }
}

... и сопоставление сотрудников

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.EmployeeID, "employeeID");
        Map(x => x.UserName, "username").Length(30);

        References<Department>(x => x.Department, "departmentID");

        Table("Employees");
    }
}

Я пытаюсь пройтись по отделам и вытащить всех сотрудников из каждого отдела:

foreach (var i in _directoryData.DepartmentCollection)
{
    foreach (var e in i.Employees)
    {
        Debug.WriteLine(i.DepartmentName + " " + e.UserName);
    }
}

, что дает мне ошибкууказав "Invalid column name 'Department_id'." ... и в сгенерированном запросе он также использует Department_id.Когда я просто перебираю отделы и выводю название отдела, оно работает нормально.

Есть идеи, что мне не хватает, чтобы получить правильное имя столбца для DepartmentID?Вот мои модельные объекты на всякий случай:

public class Department
{
    public virtual int DepartmentID { get; set; }
    public virtual string DepartmentName { get; set; }

    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee : PersistentEntity
{
    public virtual int EmployeeID { get; set; }
    public virtual string UserName { get; set; }

    public virtual Department Department { get; set; }
}

Ответы [ 3 ]

14 голосов
/ 11 мая 2011

Вы можете: создать Fluent NHibernate соглашение так, чтобы HasMany "внешний ключ" был создан как <'Name'>ID.

Или измените отображение отдела:

 HasMany(m => m.Employees).KeyColumns.Add("DepartmentID")
10 голосов
/ 11 мая 2011

Вам необходимо указать ключевой столбец.

HasMany(m => m.Employees).KeyColumn("DepartmentId");
1 голос
/ 11 мая 2011

Вам необходимо использовать метод KeyColumn в объявлении HasMany, как описано в документации

...