#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, но это не так. Это причина сбоя.