1

私は最新のプロジェクトでnHibernateを使用し、作業中のプライマリテーブルまたはコンポジットのような単純な関係のいずれかに値が存在するすべての基本的な関係を正常にマッピングしました。

行き詰まっているのは、複雑な結合のマッピングをどのように行うかです。

たとえば、 Name、DOB、Phoneなどの通常のプロパティを持つContactそれぞれというエンティティがあります。しかし、 。contactというプロパティを持つ必要もあります。AccreditationListList<Accreditation>

これは、ContactXML宣言のサンプルです。

<class name="Contact" table="Contact" lazy="true">

    <id name="ID" column="ContactID" type="guid">
      <generator class="guid" />
    </id>

    <property name="FirstName">
      <column name="FirstName" sql-type="nvarchar(500)" not-null="true" />
    </property>

    <property name="LastName">
      <column name="LastName" sql-type="nvarchar(500)" not-null="true" />
    </property>

    <bag name="AccreditationList" lazy="true">    
        //How do I express the relationship here? 
    </bag>

</class>

は、このList<Accreditation>ような一連の結合によってのみ決定できます。

SELECT Accreditation.* FROM CourseEnrolment 
INNER JOIN Course ON Course.CourseID = CourseEnrolment.CourseID
INNER JOIN CourseType ON CourseType.CourseTypeID = Course.CourseTypeID
INNER JOIN Accreditation ON Accreditation.AccreditationID = CourseType.AccreditationID
WHERE CourseEnrolment.ContactID = :ContactID

コードでnHibernateを介してSQLを手動で呼び出すことによってこれを達成する唯一の方法ですか、CreateSQLQueryそれとも名前付きクエリのようなものを使用してこの関係を表現できますか?正しいアプローチは何ですか?任意のガイダンスをいただければ幸いです。

4

1 に答える 1

1

いくつかのオプションがあります。

  1. などを使用してSqlSelectSqlUpdate選択/更新などのための任意のSQLステートメントを指定できます。(コードによるマッピングの例。同等のXMLがあると確信しています)

  2. SQLクエリをクエリにマップし、それを使用してコレクションQueryOverを初期化できます。Accreditation次のようなもの:

    public Contact GetContact(int id) { var contact = _session.Get(id); contact.AccreditationList = _session.QueryOver<Accreditation>() /* your query here */; return contact; }
    でも!!この方法にはいくつかの欠点があります-

    • この方法を使用しない場合GetContact、コレクションは正しく入力されません。
    • 連絡先のクエリは簡単にはサポートされていません(最初に連絡先をクエリし、次に各連絡先の認定リストを初期化する必要があります)。
  3. 中間エンティティ(Course)をエンティティにマップするContactと(公開したくない場合は、プライベートメンバーとして持つことができます)、AccreditationListプロパティは次のようになります。

public IEnumerable<Accreditaion> AccreditationList { get { return _courses.SelectMany(course => course.Accreditations); } } ただし、を直接 操作することはできませんContactAccreditationList

最善の解決策は、マッピングにオプションのようなものをQueryOverSelect含めることですが、AFAIKはありません...
個人的には、3番目のオプションを使用します。これは、私にとって最もクリーンなようです。

于 2012-09-25T09:37:22.233 に答える