我有以下表格:
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
属性。
有人可以帮助我实现所需的映射吗?
答案 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创建数据库模式将生成的数据库外键的名称。