Уникальные имена в первичных ключах - PullRequest
1 голос
/ 30 января 2012

У меня есть таблицы БД в каждой. У меня одинаковое имя основного столбца ('ID')

Я получаю сообщение об ошибке от nhibernate:

System.IndexOutOfRangeException : An SqlCeParameter with
ParameterIndex '5' is not contained by this SqlCeParameterCollection

Когда я изменяю имена этих столбцов на уникальные имена, все в порядке.

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

 <class name="AppSignature" table="app_signatures" lazy="true">
    <id name="Id"><generator class="guid"></generator></id>

  </class>

  <class name="AppState" table="app_states" lazy="true">
    <id name="Id"><generator class="guid"></generator></id>

    <many-to-one name="app_signature" 
                 class="AppSignature"                 
                 column="Id"
                 foreign-key="id_fom_app_signature"
                 not-null="true"                 
                 >         
    </many-to-one>

  </class>

1 Ответ

2 голосов
/ 30 января 2012

Отношение многие-к-одному означает, что экземпляр AppState может быть назначен максимум одному экземпляру AppSignature. Для AppSignature может быть назначено любое количество экземпляров AppState. Это отношение реализовано как внешний ключ от таблицы app_states к таблице app_signatures. Атрибут «Столбец» в элементе «многие к одному» определяет имя столбца, в котором хранится значение для внешнего ключа. В столбце Id отображаются два члена AppState: Id и app_signature, что невозможно в NH и приводит к описанному исключению. Исправить несложно:

<many-to-one name="app_signature" 
             class="AppSignature"                 
             column="app_signature_id"
             foreign-key="id_fom_app_signature"
             not-null="true"                 
             >         
</many-to-one>

Имя столбца, который реализует внешний ключ, было изменено на уникальное имя: «app_signature_id». Теперь элемент app_signature сопоставляется со столбцом AppState.app_signature_id, который указывает на столбец app_signatures.Id

Однако описанное исключение должно исчезнуть (если новый столбец правильно добавлен в таблицу app_signatures), оно не обязательно будет тем, что вы действительно хотите. Связь между AppState и AppSignature может быть взаимно-однозначной. Это означает, что экземпляр AppState может быть назначен одному экземпляру AppSignature и наоборот. Такое отношение может быть реализовано с помощью первичного и внешнего ключа в одном столбце. Есть очень хорошая статья об отношениях один к одному.

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