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>