尝试创建多对多映射时遇到问题。请考虑以下表格:
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)但我认为这是问题的原因。
由于
答案 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列是什么类型,故障很可能是你的主题映射。那里有一处房产,显然是在引用一名学生(我猜对了多对多的另一边)。