使用nhibernate和代码映射连接2个没有外键的表

时间:2014-07-15 08:50:04

标签: c# nhibernate nhibernate-mapping

我想加入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。我也可以用标准或类似的方法做到这一点。

1 个答案:

答案 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
        });
  }
}

有一个非常好的代码映射描述: