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か月使用しています。なぜ私がその問題を抱えているのか教えてください。ありがとうございます。