0

我在网页上使用 nHibernate 来查看现有数据库中的项目。我无法将两个表链接在一起。这两个表共享一个我需要交叉引用的公共列名。当然,我会稍微不同地设计表以更好地使用参考 ID,但由于这是一个遗留数据库,我真的需要弄清楚如何配置我的 Map 以在现有模式上工作。

我正在尝试在两个表之间使用 HasOne 关系(我还可以看到这也可以适合 ManyToOne),但我似乎无法获得任何正确的结果......已经用尽了我的谷歌缓存我现在希望有人能够对我做错的事情提供一些快速的见解。

第一个表称为“报告”,它希望从另一个名为“OperatingSystem”的表中加载对象;两者共享公共字段“Report_Number”</p>

模型类如下所示:

  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; }
  }

*与正常情况的重要区别在于,这两条记录是通过 Report_Number 索引的,而不是通过操作系统索引的 Report。

表映射如下所示:

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

目标是 ReportModel 的 OperatingSystem 对象将从共享的 Report_number 字段中正确填充。

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

{“'字段列表'中的未知列'operatings2_.Report_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>();
}

任何见解将不胜感激!

4

1 回答 1

0

尝试:

HasOne(x => x.OperatingSystem);

或者

HasOne(x => x.OperatingSystem).Constrained();

另请查看 brunoreis.com 上的这篇文章,以获取有关 HasOne 语法的更多帮助:

于 2011-02-03T20:49:39.643 回答