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

C# Nhibernate:连接表并从其他表中获取单个列,c#,.net,asp.net,nhibernate,nhibernate-mapping,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 nvarc

我有以下表格:

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
)
<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
是引用
UserInfo(Id)
的外键

<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>
我想将其映射到以下类:

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

    protected UserCredentials() { }
}
<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>
我想了解以下映射:

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>
<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>
我尝试了以下映射:

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>
<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>

但是似乎
元素的指定不正确(外键
属性)不符合我的要求。如果我省略了
外键
属性,它会尝试连接两个表的
Id
列,这是不正确的

<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>
如果可以避免的话,我不想在我的
UserCredentials
类中包含
InfoId
属性

<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>

有人能帮我实现所需的映射吗?

当您想要加入一个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>
像这样:

<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>

<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将使用该属性引用的列)

<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>

另一方面,foreign key属性有点误读,它只指定如果让nhibernate创建数据库模式将生成的数据库外键的名称

谢谢,这正是我的想法,必须为外键添加属性。我无法让它工作,并且根据此问题报告,属性引用功能实际上没有实现。有人能确认他们已经让这个工作了吗?我使用的是NHibernate2.1。这不起作用,NH仍将使用映射中定义的id,即使您定义了属性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>