2010-03-04 43 views
0

我嘗試創建多對多映射時遇到問題。請看下面的表格:NHibernate的多對多映射錯誤 - NHibernate.MappingException:無法確定類型爲:

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

錯誤是在談論NotificationType,我沒有看到你的映射。要麼你錯過了學生繪圖的重要部分,要麼就是在另一個繪圖中。 – 2010-03-04 16:00:39

+0

我搞砸了試圖匿名代碼。 – jheppinstall 2010-03-04 16:16:34

+0

請發佈您的主題類的映射,所以我可以檢查我給出的有效性的答案:) – 2011-08-13 15:42:01

回答

0

好像你是丟失的主題映射文件(記得把正確包括它?),或者你需要的,如果它是在一個不同的命名空間,以提供完整的路徑。

0

您是否記得將.hbm.xml映射文件設置爲嵌入式資源? 此行也不正確。

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

主題應該是大寫的S,這是很好的做法,給予了命名空間和裝配。如 <many-to-many column="subjectId" class="MyApp.Domain.Subject, MyApp.Domain" />

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> 

中的元素,它是可選的指定非空,獨特,類型和SQL類型的屬性,例如NHibernate會在運行時使用確定它們反思,但我明白,爲了教育學的目的,最好寫這些。此外,如果您希望對象類中的Id屬性名稱與您的表字段相同,則可以省略column屬性。 NH然後將考慮使用與數據表字段Id字段的屬性相同的名稱。

至於你的主題集合,如果你打算在你的Sudent類中使用Dictionary,你最好使用元素而不是。不過,如果你想要一個List,你最好像我一樣選擇元素。這一切都取決於你的需求和你通過這個練習的目標。

請考慮一下,我把這個NH XML映射從頭頂開始,我沒有測試它,所以它可能包含錯誤。

除此之外,你可以留意這個:Chapter 6. Collection Mapping

希望這有助於!=)

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是,故障是最有可能的在你的主題映射中。那裏有一處房產,引人注目的是一位學生(我在猜對方是多對多的)。

1

您應該再次爲主題類編寫此關係,並確保您的關係字段是正確的。

我這樣做屬性模型