NHibernate有很多对很多映射错误 - NHibernate.MappingException:无法确定类型:

时间:2010-03-04 11:22:51

标签: nhibernate nhibernate-mapping

尝试创建多对多映射时遇到问题。请考虑以下表格:

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 个答案:

答案 0 :(得分:1)

你应该再次为主题类写这个关系,并确保你的关系领域是正确的。

我使用属性模型

答案 1 :(得分:0)

看起来您要么缺少Subject的映射文件(您是否记得正确包含它?),或者如果它位于不同的命名空间中,您需要提供完整路径。

答案 2 :(得分:0)

您是否记得将.hbm.xml映射文件设置为嵌入式资源? 这条线也不正确。

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

主题应该是大写字母S,并且最好给出命名空间和程序集。如 <many-to-many column="subjectId" class="MyApp.Domain.Subject, MyApp.Domain" />

答案 3 :(得分:0)

如果我错了,请纠正我,但我猜你的Id映射有些混乱。也许它可以像你做的那样完成,我从未见过它,这是可能的。

虽然我会这样写我的映射:

<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>

在元素中,可以选择指定非null,唯一,类型和sql类型属性,因为NHibernate将在运行时使用反射来确定它们,尽管我理解为了教学目的,最好编写它们。另外,如果您希望对象类中的Id属性名称与表字段相同,则可以省略column属性。然后,NH将考虑使用与数据表字段Id字段的属性相同的名称。

至于你的主题集合,如果你打算在你的Sudent类中使用一个字典,你最好不要使用元素。但是,如果你想要一个List,你最好像我一样选择元素。这一切都取决于您的需求和您通过此练习的目标。

请考虑一下,我从头顶开始使用这个NH XML映射,我没有测试它,所以它可能包含错误。

除此之外,您还可以注意这一点:Chapter 6. Collection Mapping

希望这有帮助! =)

答案 4 :(得分:0)

我可能会弄错,但错误暗示了它:

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列是什么类型,故障很可能是你的主题映射。那里有一处房产,显然是在引用一名学生(我猜对了多对多的另一边)。