0

WebページでnHibernateを使用して、既存のデータベースのアイテムを表示しています。2つのテーブルをリンクするのに問題があります。2つのテーブルは、相互参照する必要がある共通の列名を共有しています。確かに、参照IDをより適切に使用するようにテーブルを少し異なる方法で設計しましたが、これはレガシーデータベースであるため、既存のスキーマで機能するようにマップを構成する方法を理解する必要があります。

2つのテーブル間でHasOne関係を使用しようとしています(これがManyToOneにもどのように適合するかを確認できます)が、正しい結果で何も機能しないようです...Googleキャッシュを使い果たしました私は今、誰かが私が間違っていることについていくつかの簡単な洞察を提供できるかもしれないことを望んでいます。

最初のテーブルは「Report」と呼ばれ、「OperatingSystem」と呼ばれる別のテーブルからオブジェクトをロードします。どちらも共通のフィールド「Report_Number」を共有しています</p>

Modelクラスは次のようになります。

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

*通常の状況との重要な違いは、2つのレコードが、オペレーティングシステムへのインデックスを持つレポートではなく、Report_Numberを介してインデックス付けされることです。

テーブルマッピングは次のようになります。

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

HasOne構文の詳細については、brunoreis.comのこの投稿も参照してください。

于 2011-02-03T20:49:39.643 に答える