"Неверный индекс n для этой коллекции SqlParameterCollection с Count = n" ИЛИ "внешний ключ не может быть нулевым" - PullRequest
28 голосов
/ 03 февраля 2011

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

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

Теперь, когда я использую следующее в родительском файле сопоставления:

  <bag name="SeaInfoItems" table="EDIImport_SeaInfo" lazy="false" cascade="save-update"> 
     <key column="EDI_FK_OWNERID"/> 
     <one-to-many class="FargoGate.AppLib.EdiImportSeaInfo, FargoGate.AppLib"/> 
  </bag> 

Я могу выбрать для использования в дочернем классе:

  <property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" /> 

... который дает мне печально известную ошибку «Неверный индекс n для этой SqlParameterCollection with Count = n».

ИЛИ Я пытаюсь использовать это решение, которое я нашел после некоторого поиска в Google:

   <property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" insert="false" update="false" /> 

..., которое дает мне сообщение "Невозможно вставить значение NULL в столбец" EDI_FK_OWNERID "...не разрешать нули. "ошибка.

Так что в основном мне приходится выбирать между вредителями и холерой.

Чего я не понимаю, так это того, что он работает безупречно для уже существующих классов агрегатов, и я действительно не могу заметить разницу.Единственное, что этот внешний ключ (EDI_FK_OWNERID) может ссылаться на две разные родительские таблицы.Плохой дизайн базы данных, я знаю, но я не проектировал его, и моя задача - развиваться до него к лучшему или к худшему.Я не могу изменить дизайн базы данных.

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

Также я обнаружил, что один из новых классов (который довольно мал) также работает отлично.Но я тоже не вижу, в чем здесь разница.Я в тупике!

У кого-нибудь есть подсказка?

1 Ответ

60 голосов
/ 04 февраля 2011

Aaargh!Я так сильно ошибся с этой печально известной ошибкой «Неверный индекс n для этой SqlParameterCollection with Count = n», что я упустил очевидное: дублированное отображение поля для ОДНОГО из классов.В этом конкретном сопоставлении я оставил эту ошибку, где первичный ключ также определен как свойство:

 <id name="ID" column="ID">
   <generator class="guid" />
 </id>
 <property name="ID" column="ID" /> 

Теперь это была пустая трата времени, пытаясь отладить это!

...