nHibernate многие-ко-многим с полями Same Id Key - PullRequest
1 голос
/ 14 марта 2019

Как мне объединить две таблицы как многие-к-одному и один-ко-многим в nHibernate.Они оба имеют тот же PLAN_ID, что и ключевой столбец.Мои базы данных уже существуют.

Ниже приводится сопоставление, которое я использую, и ошибка, которую я получаю:

Таблица: PLANN (- один -)

PLAN_ID  <-- PRIMARY KEY
START_DATE
CHECK_CHAR
...

Таблица: PLANN_DOCUMNET (- для многих -)

PLAN_ID <-- PRIMARY KEY
DOC_ID <-- ID to a DOCUMENT table
DOC_NAME
DOC_TYPE

Планируемый класс:

public virtual... PlanId, StartDate, CheckChar, PlanStatus,
public virtual ISet<DocsysHoldingDoc> DocsysHoldingDocs { get; set; }
public virtual DocsysHoldingDoc DocsysHoldingDoc { get; set; }

PlannDocument Class:

public virtual...PlanId, DocId, DocName, DocType
public virtual Plann PlannItem { get; set; }

Планируемый HBM XML

<class name="Plann" abstract="true" table="PLANN">
    <id name="PlanId" column="PLAN_ID"
        <generator class="assigned"/>
    </id>
    <property name="StartDate" column="START_DATE" /> 
    <property name="CHECK_CHAR" column="CHECK_CHAR" /> 
    ...

    <set name="PlannDocument" table="PLANN_DOCUMNET">
        <key column="PLAN_ID"></key> //<<KEY IN JOINING TABLE BUT ALSO ID IN THIS TABLE
        <one-to-many class="DocsysHoldingDoc"/>
     </set>
</class>

PlannDocument HBM XML

<class name="PlannDocument" abstract="true" table="PLANN_DOCUMNET">
    <id name="PlanId" column="PLAN_ID"  type = "int">
        <generator class="assigned"/>
    </id>
    <property name="DocId" column="DOC_ID" />
    <property name="DocName" column="DOC_NAME" />
    <property name="DocType" column="DOC_TYPE" />

    <many-to-one name="Plann" column="PLAN_ID"></many-to-one>

</class>

ОШИБКА: NHibernate.MappingException: 'Невозможно создать оператор вставки для класса <>. PlannDocument: произошла ошибка при добавлении идентификатора класса'

ArgumentException: В этом построителе SQL уже добавлен столбец PLAN_ID Имя параметра: columnName

Я что-то тут не так делаю ??

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Если у вас есть один и тот же столбец для identifier и для желаемой many-to-one ассоциации - это не совсем many-to-one ассоциация. Совместное использование одного и того же identifier означает, что это one-to-one ассоциация. Просто используйте его вместо вашего many-to-one отображения в PlannDocument.hbm.xml, и оно должно работать:

<one-to-one name="Plann" constrained="true" />

Если ваш PlannDocument.Plann может быть нулевым, используйте вместо него constrained="false". Но имейте в виду, что это будет стоить вам дополнительного запроса, чтобы проверить, действительно ли существует Plann.

1 голос
/ 15 марта 2019

Судя по вашим комментариям (под удаленным ответом), имя столбца первичного ключа в обеих таблицах одинаково - т.е. PLAN_ID. Вы хотите объединить эти две таблицы на основе отношения «многие к одному».

Проблема здесь в том, что одно и то же имя столбца (из двух разных таблиц) добавляется дважды в отображение.

Вот почему ошибка:

ОШИБКА: NHibernate.MappingException: 'Невозможно построить оператор вставки для класса <>. PlannDocument : произошла ошибка при добавлении идентификатора класса'

ArgumentException: столбец 'PLAN_ID' уже был добавлен в этот построитель SQL Имя параметра: columnName

В PlannDocument HBM имя столбца PLAN_ID впервые используется при создании id, как показано ниже:

<id name="PlanId" column="PLAN_ID"  type = "int">

, а затем снова при создании отношения many-to-one, как показано ниже:

<many-to-one name="Plann" column="PLAN_ID"></many-to-one>

Это вызывает конфликт имени столбца.

Решение, которое я могу придумать, состоит в том, чтобы изменить имя столбца на что-то другое из другой таблицы. Кроме того, измените классы и отображения соответственно.

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

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