C# 帮助尝试使用HasOne链接nHibernate中共享公共数据库列的两个表

C# 帮助尝试使用HasOne链接nHibernate中共享公共数据库列的两个表,c#,mysql,nhibernate,has-one,C#,Mysql,Nhibernate,Has One,我在网页上使用nHibernate查看已有数据库中的项目。我把两张桌子连在一起有困难。这两个表共享一个我需要交叉引用的公共列名。当然,为了更好地使用引用ID,我会对表进行稍微不同的设计,但由于这是一个遗留数据库,我真的需要弄清楚如何配置映射以在现有模式下工作 我正在尝试在两个表之间使用HasOne关系,我也可以看到这如何也适用于多个表,但我似乎无法获得任何正确的结果…在用尽我的Google缓存后,我现在希望有人能够快速了解我做错了什么 第一个表名为“Report”,它希望从另一个名为“Opera

我在网页上使用nHibernate查看已有数据库中的项目。我把两张桌子连在一起有困难。这两个表共享一个我需要交叉引用的公共列名。当然,为了更好地使用引用ID,我会对表进行稍微不同的设计,但由于这是一个遗留数据库,我真的需要弄清楚如何配置映射以在现有模式下工作

我正在尝试在两个表之间使用HasOne关系,我也可以看到这如何也适用于多个表,但我似乎无法获得任何正确的结果…在用尽我的Google缓存后,我现在希望有人能够快速了解我做错了什么

第一个表名为“Report”,它希望从另一个名为“OperatingSystem”的表加载对象;两者共享公共字段“报告编号”

模型类如下所示:

  public class ReportModel
  {
    public virtual int Report_Number { get; set; }
    public virtual OperatingSystemsModel OperatingSystem { get; set; }
  }
  public class OperatingSystemsModel
  {
    public virtual string OS_Name { get; set; }
    public virtual int Report_Number { get; set; }
  }
public ReportMap()
{
  Table("pcd_PROBLEM40");
  Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native();
  HasOne(x => x.OperatingSystem).PropertyRef(x => x.Report_Number).ForeignKey("Report_Number");
}
public OperatingSystemsMap()
{
  Table("pcd_os_names");
  Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native();
  Map(x => x.OS_Name);
}
*与正常情况的重要区别在于,这两个记录是通过Report_编号索引的,而不是通过操作系统中的索引索引的报表

表映射如下所示:

  public class ReportModel
  {
    public virtual int Report_Number { get; set; }
    public virtual OperatingSystemsModel OperatingSystem { get; set; }
  }
  public class OperatingSystemsModel
  {
    public virtual string OS_Name { get; set; }
    public virtual int Report_Number { get; set; }
  }
public ReportMap()
{
  Table("pcd_PROBLEM40");
  Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native();
  HasOne(x => x.OperatingSystem).PropertyRef(x => x.Report_Number).ForeignKey("Report_Number");
}
public OperatingSystemsMap()
{
  Table("pcd_os_names");
  Id(x => x.Report_Number).Column("Report_Number").GeneratedBy.Native();
  Map(x => x.OS_Name);
}
目标是报告模型的OperatingSystem对象将从共享报告编号字段中正确填充

我尝试了HasOne与PropertyRef和ForeignKey的多种组合,但似乎都没有找到一种有效的组合。 当我尝试获取报告时,我不断收到以下异常

{“字段列表”中的未知列“operatings2.Report\u Number”}

public static ReportModel GetReport(int i_iReportNumber)
{
  ICriteria criteria = Session.CreateCriteria(typeof(ReportModel));
  criteria.Add(Restrictions.Eq("Report_Number", i_iReportNumber));
  return criteria.UniqueResult<ReportModel>();
}
任何见解都将不胜感激

试试看:

HasOnex=>x.操作系统

HasOnex=>x.OperatingSystem.Constrained

另请参阅,以获取有关HasOne语法的更多帮助: