2009-11-24 55 views
1

嘿所有,我踢NHibernate的輪胎,並有一個混亂,我一直在撓頭,現在有點工作與遺留數據庫與一些相當複雜關係。NHibernate許多對一/一對一用不同的鍵

ClaimRoot具有claimGUID的主鍵。 ClaimRoot有一個與claimGUID關聯的ClaimDetails包(這是一種享受)。

問題是,ClaimRoot也與ClaimFinancials有一個可選的一對一關係(並非所有ClaimRoots都有ClaimFinancials,但大多數都是)。但ClaimFinancials的PK是一個FormID字段。該字段存在於ClaimRoot中,但不是PK。

爲了保護無辜,我已經發布了一個映射,下面加了多餘的列。

<class name="ClaimRoot" table="tbl_ClaimRoot" schema="DB1.dbo"> 
    <id name="ClaimGUID"> 
     <generator class="guid"/>  
    </id> 
    <property name="FormID" /> 
    <property name="LastFormNoteText" /> 
    <bag name="ClaimDetails" inverse="true"> 
     <key column="ClaimGUID"/> 
     <one-to-many class="ClaimDetails"/> 
    </bag> 
    </class> 

    <class name="ClaimDetails" table="tbl_ClaimDetails" schema="DB2.dbo"> 
    <id name="RowID"> 
     <generator class="native"/> 
    </id> 
    <property name="ClaimGUID" /> 
    <property name="SeqNo"/> 
    <property name="B1A_InsID" /> 
    <many-to-one name="Root" column="ClaimGUID" foreign-key="ClaimGUID"/> 
    </class> 


    <class name="ClaimFinancials" table="tbl_ClaimFinancials" schema="DB1.dbo"> 
    <id name="FormID"> 
     <generator class="native"/> 
    </id> 
    <property name="CreatedDate"/> 
    <property name="SubmittedDate" /> 
    </class> 

在此先感謝! -Bob

+0

只是一個背景FYI - 我將這些關係拉到一起的原因是,我們目前的POCO有方法,Sprocs在單一方法調用中更新了ClaimFinancials和ClaimRoot或ClaimFinancials和ClaimDetails,因爲這些關係緊密, d更喜歡不撕開傳統應用程序。 – 2009-11-24 10:45:19

回答

1

假設FormID僅用於鏈接ClaimRoot和ClaimFinancials,聽起來好像你想要一個從ClaimRoot到ClaimFinancials的多對一關係。將ClaimRoot上的FormId屬性替換爲多對一。

<class name="ClaimRoot" table="tbl_ClaimRoot" schema="DB1.dbo"> 
    ... 
    <many-to-one name="ClaimFinancials" column="FormID" /> 
    ... 
    </class> 

即使「多」一邊只有「一個」,也可以使用多對一的關係。如果您正在生成模式,則可以指定unique="true"在數據庫中生成約束。使用遺留數據庫,這並不重要。

+0

這工作 - 非常感謝! – 2009-11-24 11:20:47