2009-12-13 28 views
2

我有以下表獲得單柱:NHibernate的:加入表和其他表

create table Users(
Id uniqueidentifier primary key, 
InfoId uniqueidentifier not null unique, 
Password nvarchar(255) not null 
) 

Create table UserInfo(
Id uniqueidentifier primary key, 
Company nvarchar(255) not null, 
ContactPerson nvarchar(255) not null 
) 

而且InfoId是一個外鍵引用UserInfo(Id)

我想這個映射到以下類:

public class UserCredentials 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual string PasswordHash { get; set; } 

    protected UserCredentials() { } 
} 

我想下面的映射:

Id --> Users(Id) 
UserName --> UserInfo(Company) 
PasswordHash --> Users(Password) 

我嘗試了以下映射:

<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="UserCredentials" table="Users"> 
     <id name="Id" type="Guid"> 
      <generator class="guid.comb" /> 
     </id> 

    <property name="PasswordHash" not-null="true" column="Password"/> 
    <join table="UserInfo"> 
     <key column="Id" foreign-key="InfoId"/> 
     <property name="UserName" column="Company" not-null="true" /> 
    </join> 
    </class> 
</hibernate-mapping> 

但似乎<key>元素被錯誤地指定(foreign-key屬性)不會做我想要的。如果我忽略了foreign-key屬性,它會嘗試加入兩個表的Id列,這是不正確的。

如果可以避免,我不想在我的UserCredentials類中包含InfoId屬性。

任何人都可以幫助我實現所需的映射嗎?

回答

4

當你想加入一個關聯或只是另一個表,就像你在這裏所做的那樣,不是基於主鍵而是在其他一些列上,你需要使用property-ref屬性。

這樣的:

<property name="InfoId" not-null="true" column="InfoId"/> 
<property name="PasswordHash" not-null="true" column="Password"/> 

<join table="UserInfo"> 
    <key column="Id" property-ref="InfoId"/> 
    <property name="UserName" column="Company" not-null="true" /> 
</join> 

這意味着你還需要添加INFOID您UserCredentials類,目前還沒有辦法MAPP關係或加入像上面一樣使用列名你必須提供一個屬性(NH將使用該屬性所指的列)

在附註上,foreign-key屬性有點誤導性,它只指定了如果您讓nhibernate創建數據庫模式將生成的數據庫外鍵的名稱。

+0

謝謝,這是有點我想到的,不得不添加一個屬性的外鍵。 – 2009-12-14 08:41:59

+3

我無法得到這個工作,並根據這個問題報告http://216.121.112.228/browse/NH-1452屬性ref參數沒有實際執行。任何人都可以證實他們已經得到這個工作?我正在使用nHibernate 2.1。 – sgriffinusa 2010-12-10 23:30:19

+2

這不起作用,即使你定義了一個property-ref,NH仍然會使用映射中定義的id – 2013-03-20 09:47:34