我想加入2个表。它们没有外键,但它们有一个具有相同内容的列。我无法更改架构,这是一个简化的示例:
public class Person{
public virtual string Name{get;set;}
public virtual int Id{get;set;}
public virtual char Gender{get;set;} #this one I want to connect
}
public class PersonMapping : ClassMapping<Person>{
public PersonMapping()
{
Id(x=>x.Id);
Property(x=>x.Name);
Property(x=>x.Gender);
}
}
public class Gender{
public virtual char ShortName{get;set;} #to this. So they are the same. When They are connected I want to access the Other properties of this class
public virtual int Id{get;set;}
public virtual string LongName{get;set;}
}
public class GenderMapping: ClassMapping<Gender>{
public GenderMapping()
{
Id(x=>x.Id);
Property(x=>x.ShortName);
Property(x=>x.LongName);
}
}
现在我希望所有具有相应性别的人。这样我才能找到长名。我认为解决方案类似于this,但它适用于流利的nhibernate。我也可以用标准或类似的方法做到这一点。
答案 0 :(得分:0)
你快到了。但 Property Gender必须映射为所谓的many-to-one
,我们必须使用名为property-ref
的功能。参见:
property-ref
属性仅应用于映射遗留数据,其中外键是指除主键之外的关联表的唯一键。这是一个丑陋的关系模型。例如,假设Product类具有唯一的序列号,而不是主键。 (unique属性使用SchemaExport工具控制NHibernate的DDL生成。)
<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>
然后OrderItem的映射可能会使用:
<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>
首先,我们必须引入Reference而不是char:
public class Person
{
public virtual string Name{get;set;}
public virtual int Id{get;set;}
//public virtual char Gender{get;set;} #this one I want to connect
public virtual Gender Gedner { get; set; }
}
所以映射应该是这样的:
public class PersonMapping : ClassMapping<Person>
{
public PersonMapping()
{
Id(x=>x.Id);
Property(x=>x.Name);
//Property(x=>x.Gender);
ManyToOne(x => x.Gender, x =>
{
x.PropertyRef("ShortName"); // this is the property of a Gender class!
x.Column("Gender"); // to be mapped with the Pesons's column Gender
});
}
}
有一个非常好的代码映射描述: