Nhibernate:连接表并从其他表中获取单列

时间:2009-12-13 14:23:51

标签: c# .net asp.net nhibernate nhibernate-mapping

我有以下表格:

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属性。

有人可以帮助我实现所需的映射吗?

1 个答案:

答案 0 :(得分:4)

如果你想加入一个realation或者只是像你在这里做的那样基于非主键,而是在其他一些列上你需要使用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创建数据库模式将生成的数据库外键的名称。