2009-02-08 161 views
1

我正在使用nhibernate映射舊數據庫,並在映射關係時遇到了一些問題。使用外鍵映射一個到多個集合到外鍵

這兩個類是這樣

public class Questionnaire 
{ 
    public int Id {get; set;} 
    public string FormCode {get; set;} 
    public IList<Question> Questions {get; set;} 
} 

public class Question 
{ 
    public int Id{get; set;} 
    public Questionnaire Questionnaire {get;set;} 
    public string QuestionText{get;set;} 
} 

到都是這樣

Questionnaire Table 
Id int 
FormCode varchar(100) 

Question Table 
Id int 
FormCode varchar(100) 
QuestionText varchar(max) 

兩個表是所述formcode列之間的關係的表。

我當前的映射是這樣的

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core"> 
<class name="Questionnaire" table="_questionnaire_list"> 
    <id column="Id" name="Id"> 
      <generator class="identity"/> 
    </id> 
     <property name="FormCode" column="FormCode"/> 
     <bag name="Questions" > 
      <key foreign-key="FormCode" property-ref="FormCode" /> 
      <one-to-many class="Question" />    
     </bag> 
</class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core"> 
<class name="Question" table="_questionnaire_items"> 
    <id column="ID" name="Id" unsaved-value="-1"> 
      <generator class="identity" /> 
     </id> 
     <property name="QuestionText" column="QuestionText" /> 
</class> 
</hibernate-mapping> 

當我運行的映射,我得到一個標識符類型不匹配假設它試圖把formcode進入正題的ID。不幸的是,我無法改變表格的結構,我對如何繪製這張表格感到茫然,任何幫助都將不勝感激。

回答

4

你的關係是一個m:N的關係而沒有中間實體。以這種方式定義m:n關係是一個典型的錯誤,因爲它會刪除一個pk端,這會導致出現兩個表具有相同屬性/字段的情況,並且它們碰巧在語義上表示相同的東西。但是,因爲它們在雙方都是非pk值,所以可能存在冗餘和不準確性。你可以在兩個字段上將兩個表連接在一起,但在語義上它沒有任何意義:對於實體模型將實體X關聯到Y,FK端將關係的PK端作爲FK字段獲取,對於m:n關係,您需要來自中間實體的兩個m:1關係。這是,沒有例外。

所以,雖然要映射這一點,你提出的方式,它不能做的O/R映射器不能保證正確性,因爲建議的關係簡直是不正確的。

2

嗯,這是「問題」與奧姆斯。我說「問題」是因爲Hibernate在技術上是正確的:外鍵應該是主鍵。但是,正如你所見證的那樣,情況並非總是如此。

實際用於什麼ID?如果沒有,阻力最小的路徑是使FormCode成爲主鍵。這是一個選擇嗎?

如果沒有,我真的不知道該怎麼做以外的查詢問題,而不是把他們當作孩子的實體。

+0

謝謝你的回覆。我會回到客戶端,看看我能否讓他們改變他們的模式。再次感謝您的回覆 – pythonandchips 2009-02-08 13:37:59

+0

請記住,您不一定必須更改模式。這可能足以告訴Hibernate PK是FormCode(即使它不是)。 – cletus 2009-02-08 13:57:57