Отображение NHibernate со строками, без реальных внешних ключей - PullRequest
1 голос
/ 27 мая 2009

У меня есть класс "Лаборатория", который представляет департамент компании, которая использует мою программу. У него есть дочерняя коллекция под названием «Сотрудники», которая должна содержать всех сотрудников, принадлежащих этой лаборатории. Таблица сотрудников содержит строковое поле с именем «Отдел», которое представляет, к какому отделу они принадлежат, а таблица «Лаборатория» содержит строковое поле с именем «Отдел», которое представляет, какой отдел является лабораторией. Сотрудник принадлежит Лаборатории, когда отдел сотрудника совпадает с отделом лаборатории.

Я понимаю, что наличие таблицы сотрудников, содержащей поле LabID, было бы предпочтительным подходом, однако таблица сотрудников не находится под моим контролем, и я не хочу ее изменять. Я бы предпочел сделать это, не добавляя таблицу сопоставления сотрудников в лабораторию, поскольку результат от отдела к отделу такой же.

Это сокращенное отображение, которое я пытаюсь использовать.

  <class name="Lab">
    <id name="LabID">
      <generator class="native" />
    </id>
    <property name="Department" />
    <!--- other properties --->
    <set name="Employees" table="Employee_copy" generic="true" inverse="true">
      <key column="Department" property-ref="Department" />      
      <one-to-many class="Employee" />
    </set>
  </class>

ошибка, которая возвращается

Identifier type mismatch; Found:<System.Int32> Expected:<System.String> Parameter name: identifier

Сгенерированный запрос работает нормально.

SELECT employees0_.Department as Department1_, employees0_.EmployeeID as EmployeeID1_, employees0_.EmployeeID as EmployeeID30_0_, employees0_.CommonName as CommonName30_0_, employees0_.LastName as LastName30_0_, employees0_.NetUserID as NetUserID30_0_, employees0_.CompanyID as CompanyID30_0_, employees0_.Department as Department30_0_ FROM Employee employees0_ WHERE employees0_.Department='IS'

так что я делаю не так?

EDIT:

Обратите внимание, что обратная связь работает нормально.

<many-to-one name="Lab" column="Department" property-ref="Department" class="Lab" />

Связанные свойства для обоих объектов- Лабораторная работа:

public virtual int LabID { get; set; }
public virtual string Department { get; set; }
public virtual ISet<Employee> Employees { get; set; }

Сотрудник:

public virtual int EmployeeID { get; protected set; }     
public virtual string Department { get; protected set; } 
public virtual Lab Lab { get; protected set; }  

1 Ответ

0 голосов
/ 29 мая 2009

Поскольку таблица Employee должна была быть неизменной, я закончил тем, что создал представление, которое получило идентификатор лаборатории на основе отдела, и связал его с таблицей сотрудников напрямую.

Мех. Работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...