0

N2CMS のデータベース構造をカスタマイズしていて、問題が発生しました。2 つのクラスを以下に示します。

public class Customer : ContentItem
{
  public IList<License> Licenses { get; set; }
}

public class License : ContentItem
{
  public Customer Customer { get; set; }
}

nhibernate マッピングは次のとおりです。

  <class name="N2.ContentItem,N2" table="n2item">
    <cache usage="read-write" />
    <id name="ID" column="ID" type="Int32" unsaved-value="0" access="property">
      <generator class="native" />
    </id>
    <discriminator column="Type" type="String" />
  </class>

  <subclass name="My.Customer,My" extends="N2.ContentItem,N2" discriminator-value="Customer">
    <join table="Customer">
      <key column="ItemID" />
      <bag name="Licenses" generic="true" inverse="true">
        <key column="CustomerID" />
        <one-to-many class="My.License,My"/>
      </bag>
    </join>
  </subclass>

  <subclass name="My.License,My" extends="N2.ContentItem,N2" discriminator-value="License">
    <join table="License" fetch="select">
      <key column="ItemID" />
      <many-to-one name="Customer" column="CustomerID"  class="My.Customer,My" not-null="false" />
    </join>
  </subclass>

次に、Customer のインスタンスを取得すると、customer.Licenses は常に空ですが、実際にはデータベースに顧客のライセンスがあります。nhibernate ログ ファイルを確認すると、SQL クエリが次のようになっていることがわかります。

SELECT   licenses0_.CustomerID     as CustomerID1_,
         licenses0_.ID             as ID1_,
         licenses0_.ID             as ID2_0_,
         licenses0_1_.CustomerID   as CustomerID7_0_,
FROM     n2item licenses0_
         inner join License licenses0_1_
           on licenses0_.ID = licenses0_1_.ItemID
WHERE    licenses0_.CustomerID = 12 /* @p0 */

nhibernate は、CustomerID が「n2item」テーブルにあると考えているようです。理由はわかりませんが、それを機能させるには、SQLは次のようにする必要があると思います。

SELECT   licenses0_.ID             as ID1_,
         licenses0_.ID             as ID2_0_,
         licenses0_1_.CustomerID   as CustomerID7_0_,
FROM     n2item licenses0_
         inner join License licenses0_1_
           on licenses0_.ID = licenses0_1_.ItemID
WHERE    licenses0_1_.CustomerID = 12 /* @p0 */

私のマッピングの何が問題なのか、誰でも指摘できますか? また、ある顧客の正しいライセンスを取得するにはどうすればよいですか? 前もって感謝します。

4

1 に答える 1

0

親クラスのマッピングはディスクリミネーターを使用するため、SQL が間違っているかどうかはわかりません。そのため、すべてのプロパティが基本クラス (n2item) と同じテーブルに格納されると予想されます。ただし、「結合テーブル」の構文に慣れていないため、通常は結合サブクラスを使用しているため、誤解されている可能性があります。

サブクラスのマッピングが正しいと仮定すると、ライセンスの問題は、そのコレクションにカスケード設定が設定されていないことに関係している可能性がありますか?

于 2010-04-09T14:57:40.757 に答える