Проблема с отображением внешнего ключа в NHibernate hasMany в NHibernate

#nhibernate #fluent-nhibernate #fluent-nhibernate-mapping

#nhibernate #свободный-nhibernate #fluent-nhibernate-mapping

Вопрос:

Я пытаюсь отобразить простую структуру данных в 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; }
}
  

Комментарии:

1. @David — да, я это сделал. Мое отображение, похоже, совпадает с отображением wiki на сайте fluentnhibernates.

Ответ №1:

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

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

  HasMany(m => m.Employees).KeyColumns.Add("DepartmentID")
  

Комментарии:

1. Спасибо, я, должно быть, пропустил эту часть во fluents wiki.

Ответ №2:

Вам нужно указать столбец ключа.

 HasMany(m => m.Employees).KeyColumn("DepartmentId");
  

Ответ №3:

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