2009-12-13 3 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 обеих таблиц, что неверно.

Я не хочу включать имущество InfoId на мой класс UserCredentials, если его можно избежать.

Может ли кто-нибудь помочь мне достичь желаемого картографирования?

ответ

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, не существует в настоящее время нет возможности МАПП отношения или присоединиться как указано выше, используя имя столбца, вы должны определить свойство (NH будет использовать столбец, к которому относится свойство)

С другой стороны, атрибут внешнего ключа немного пропущен, он указывает только имя внешнего ключа базы данных, которое будет сгенерировано, если вы разрешите nhibernate создать схему базы данных.

+0

Спасибо, это было то, что я имел в виду, добавляя свойство для внешнего ключа. –

+3

Я не могу заставить это работать, и на основе этого отчета о проблеме http://216.121.112.228/browse/NH-1452 функция property-ref фактически не реализована. Может ли кто-нибудь подтвердить, что они получили это на работу? Я использую nHibernate 2.1. – sgriffinusa

+2

Это не работает, NH по-прежнему будет использовать идентификатор, определенный в сопоставлении, даже если вы определите свойство-ref –