Ошибка сопоставления NHibernate многие ко многим - NHibernate.MappingException: Не удалось определить тип для: - PullRequest
0 голосов
/ 04 марта 2010

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

CREATE TABLE [dbo].[student]
(
    [Id]            INT             IDENTITY (1, 1) NOT NULL,
    [Name]          NVARCHAR(255)   NOT NULL,
    -- Some other stuff...      
)

CREATE TABLE [dbo].[Subject]
(
    [Id]            INT             IDENTITY (1, 1) NOT NULL,
    [Name]  NVARCHAR (50)   NOT NULL,

    -- Some other stuff...
)

CREATE TABLE [dbo].[studentToSubject]
(
    [studentId] INT NOT NULL,
    [subjectId]     INT NOT NULL,
)

Интересная часть моего файла отображения студента выглядит так:

<id name="Id" type="Int32">
      <column name="Id" sql-type="int" not-null="true" unique="true"/>
      <generator class="native" />
    </id>

      <property name="Name" not-null="true" />
      <bag name="subjects" table="studentToSubject">
          <key column="studentId"></key>
          <many-to-many column="subjectId" class="subject" />
      </bag>

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

NHibernate.MappingException: Could not determine type for: MyApp.Domain.Subject, MyApp.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=865c2d2b185d0c4b, for columns: NHibernate.Mapping.Column(studentId).

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

Спасибо

Ответы [ 5 ]

1 голос
/ 17 августа 2011

Вы должны снова написать это отношение для предметного класса и убедиться, что ваше поле для отношения правильное.

я делаю это с атрибутами моделей

0 голосов
/ 13 августа 2011

Я могу ошибаться, но на это намекает ошибка:

NHibernate.MappingException: Could not determine type for: MyApp.Domain.Subject, MyApp.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=865c2d2b185d0c4b, for columns: NHibernate.Mapping.Column(studentId).

В основном, как я читаю ошибку, NHibernate не может понять, какой тип столбца studentId. Ошибка, скорее всего, в вашем сопоставлении темы. Там есть свойство, которое ссылается на ученика (я думаю, что другая сторона многих ко многим).

0 голосов
/ 05 марта 2010

Вы не забыли установить файлы сопоставления .hbm.xml на встроенный ресурс? Также эта строка не верна.

<many-to-many column="subjectId" class="subject" />

Субъектом должна быть заглавная буква S, поэтому рекомендуется указывать пространство имен и сборку. такие как <many-to-many column="subjectId" class="MyApp.Domain.Subject, MyApp.Domain" />

0 голосов
/ 05 марта 2010

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

Хотя я бы написал свое отображение так:

<class name="Student"> <!-- I omit the table attribute as both your class and table seems to have the same name. -->
  <id name="Id">
    <generator class="native"/> <!-- Though I would recommend using "identity" if SQL Server's used. -->
  </id>

  <property name="Name" length="255" not-null="true"/>

  <list name="Subjects" not-null="true" table="StudentToSubject">
    <key column="studentId" />
    <many-to-many column="studentId" class="Subject" />
  </list>
</class>

Внутри элемента необязательно указывать атрибуты not-null, unique, type и sql-type, поскольку NHibernate будет определять их во время выполнения, используя рефлексию, хотя я понимаю, что в педагогических целях их лучше писать. Кроме того, если вы хотите, чтобы имя вашего свойства Id в вашем классе объектов совпадало с полем таблицы, вы можете просто пропустить атрибут столбца. Затем NH рассмотрит использование того же имени, что и свойство для поля Id поля таблицы данных.

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

Пожалуйста, учтите, что я взял это сопоставление NH XML прямо из головы, и я не проверял его, поэтому он может содержать ошибки на лету.

В дополнение к этому вы можете взглянуть на это: Глава 6. Составление карт коллекции

Надеюсь, это поможет! =) * * 1016

0 голосов
/ 04 марта 2010

Похоже, вы либо пропустили файл сопоставления для субъекта (вы не забыли правильно его включить?), Либо вам нужно указать полный путь, если он находится в другом пространстве имен.

...