2

1 つのテーブルと 1 つのテーブルを複数回結合すると、NHibernate に問題が発生します。私はICriteriaを使用しています。私は2つのテーブルを持っています。どれどれ:

従業員:

EmployeeID (PK)
Gender (will join with table tblCommons) (this is Key data in tblCommons)
Status (will join with table tblCommons) (this is Key data in tblCommons)

注: tblEmployees には tblCommons の PK はありません。

tblCommons:

ID (PK)
Code (will use to specific Gender data and Status data) (ex: 1 is Gender, 2 is Status)
Key
Value

これは tblEmployees のデータです。

EmployeeID                 Gender                  Status 
  1                          1                        1
  2                          1                        2
  3                          2                        1

これは tblCommons のデータです

ID                  Code                  Key                   Value
1                     1                     1                   Male
2                     1                     2                   Female
3                     2                     1                   Active
4                     2                     2                   Inactive

Employees.hbm.xml ファイル内

<class name="Demo.Employees, Demo" table="tblEmployees">
    <id name="EmployeeID" column="EmployeeID" type="String">
    </id>
    <many-to-one class="Demo.Commons, Demo" name="Gender" column="Gender" />
    <many-to-one class="Demo.Commons, Demo" name="Status" column="Status" />
</class>

従業員クラスで

namespace Demo
{
    public class Employees
    {
        public Employees(){}
        public virtual string EmployeeID { get; set; }
        public virtual Commons Gender{ get; set; }
        public virtual Commons Status{ get; set; }
    }
}

Commons.hbm.xml 内

<class name="Demo.Commons, Demo" table="tblCommons">
    <id name="Key" column="Key" type="String">
    </id>
    <property name="Code" column="Code" type="String" />
    <property name="Value" column="Value" type="String" />
    <set name="Genders" table="tblEmployees" generic="true" inverse="true">
      <key column="Gender" />
      <one-to-many class="Demo.Employees, Demo"/>
    </set>
    <set name="Status" table="tblEmployees" generic="true" inverse="true">
      <key column="Status" />
      <one-to-many class="Demo.Employees, Demo"/>
    </set>
</class>

注:xmlでは、「id」を「キー」に設定しました。これは、NHibernateで「id」が別のテーブルと結合されるデータであるためです。ここで、tblEmployees では、tblEmployees の Gender と Status が tblCommons の「キー」データです。だから、私はxmlで「id」を「キー」に設定しました

コモンズクラスで

namespace Demo
{
    public class Commons
    {
        public Commons(){}
        public virtual string Key { get; set; }
        public virtual string Code { get; set; }
        public virtual string Value { get; set; }
        public virtual Iesi.Collections.Generic.ISet<Employees> Genders { get; set; }
        public virtual Iesi.Collections.Generic.ISet<Employees> Status { get; set; }
    }
}

注:プロジェクトでは「ID」データを使用しないため、xmlファイルとCommonsクラスのtblCommonsに「ID」を設定しません

これは、従業員データを取得するために使用するコードです

ICriteria criteria = session.CreateCriteria(typeof(Employees));
criteria.CreateCriteria("Gender", "Gender", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.Add(Restrictions.Eq("Gender.Code", "1"));
criteria.CreateCriteria("Status", "Status", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.Add(Restrictions.Eq("Status.Code", "2"));
IList<Employees> list = new List<Employees>();
list = criteria.List<Employees>();

ここに問題があります:

「リスト」では、従業員オブジェクトの「性別」は、次のように変更すると「ステータス」のデータを持ちます: 最初に CreateCriteria 「ステータス」、次に CreateCriteria 「性別」 、「ステータス」は「性別」のデータを持ちます。

どうしてか分かりません。私はNHibernateを約1か月使用しています。なぜ私がその問題を抱えているのか教えてください。ありがとうございます。

4

1 に答える 1

0

問題は、CommonsオブジェクトのIDプロパティとしてKey列を使用していることです。IDプロパティは一意であり、「意味のある」データから切り離されている必要があります。CommonsクラスにIDプロパティを追加し、Keyを通常のプロパティに変更する必要があります。マッピングを変更し、「セット」マッピングに注意してください-

    <class name="Demo.Commons, Demo" table="tblCommons">
       <id name="ID" column="ID" type="String">
          <generator class="identity"/>
       </id>
       <property name="Key" column="Key" type="String" />
       <property name="Code" column="Code" type="String" />
       <property name="Value" column="Value" type="String" />
       <set name="Genders" table="tblEmployees" generic="true" inverse="true">
         <key column="Key" property-ref="Gender" />
         <one-to-many class="Demo.Employees, Demo"/>
       </set>
       <set name="Status" table="tblEmployees" generic="true" inverse="true">
          <key column="Key" property-ref="Status" />
          <one-to-many class="Demo.Employees, Demo"/>
       </set>
  </class>



  <class name="Demo.Employees, Demo" table="tblEmployees">
      <id name="EmployeeID" column="EmployeeID" type="String">
      </id>
      <many-to-one class="Demo.Commons, Demo" name="Gender" column="Gender" property-ref="Key"/>
      <many-to-one class="Demo.Commons, Demo" name="Status" column="Status" property-ref="Key"/>
  </class>
于 2012-09-03T10:52:31.647 に答える