NHibernate: используйте одну таблицу в нескольких сопоставлениях «многие к одному»

#c# #nhibernate #nhibernate-mapping

#c# #nhibernate #nhibernate-сопоставление

Вопрос:

Для моего отдела продаж все работает нормально. Я могу сохранить и получить графики цен, но я получаю ошибку ограничения внешнего ключа при попытке сохранить данные в моей таблице SellEmployee:

Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK9B5C4AB8B12F319A»

Я знаю, что могу решить эту проблему, создав класс SellBase, от которого затем наследуют SellDepartment и SellEmployee, но мне действительно не нравится иметь дополнительную таблицу в базе данных только для этого.

Итак, мой вопрос в том, могу ли я решить эту проблему, просто используя файлы сопоставления? Если да, что я делаю не так?

У меня есть таблица, содержащая строки для разных других таблиц:

 **PriceLines tabel**
PriceLineId
Price
Type
SellId

**SellDepartment tabel**
SellDepartmentId
Reason
DepartmentId

**SellEmployee tabel**
SellEmployeeId
Reason
EmployeeId
  

Мой файл сопоставления NHibernate для PriceLines содержит эти сопоставления «многие к одному»:

 <subclass name="Source1Line" discriminator-value="DepartmentLine" extends="PriceLines">
  <many-to-one name="Source1" column="SourceId" class="Source1" />
</subclass>

<subclass name="Source2Line" discriminator-value="EmployeeLine" extends="PriceLines">
  <many-to-one name="Source2" column="SourceId" class="Source2"  />
</subclass>
  

И файлы сопоставления для моего отдела продаж и SellEmployee:

 <set name="PriceLines" cascade="all-delete-orphan" inverse="true">
  <key column="SellId"/>
  <one-to-many class="DepartmentLine"/>
</set>

<set name="PriceLines" cascade="all-delete-orphan" inverse="true">
  <key column="SellId"/>
  <one-to-many class="EmployeeLine"/>
</set>
  

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

1. Просто примечание: возможно, это только я и моя проблема, но ваше упрощенное определение выше неясно. Хотя я хотел бы подтвердить, понятия не имею, что все это значит…

Ответ №1:

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

Priceline.SellId может быть либо SellEmployeeId, либо SellDepartmentId, и, исходя из имеющейся у меня здесь информации, я предполагаю, что это первичные ключи.

Итак, у вас есть 2 ограничения для Priceline как с SellEmployee, так и с SellDepartment, и когда вы вставляете строку в Priceline, ограничения ожидают наличия соответствующей записи как в SellEmployee, так и в SellDepartment, но это не так. Это причина сбоя.