2

一部の子エンティティを、親複合キーのすべてではなく一部で参照しようとしていますが、なぜできませんか? これは、コメントされているものの代わりに次のマッピングを使用すると発生します。

次のエラーが表示されます

テーブル VolatileEventContent の外部キーには、テーブル LocationSearchView で参照される主キーと同じ数の列が必要です

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="JeanieMaster.Domain.Entities" assembly="JeanieMaster.Domain">
  <class name="LocationSearchView" table="LocationSearchView">

    <composite-id>
      <key-property name="LocationId" type="Int32"></key-property>
      <key-property name="ContentProviderId" type="Int32"></key-property>
      <key-property name="CategoryId" type="Int32"></key-property>
    </composite-id>

    <property name="CompanyName" type="String" not-null="true" update="false" insert="false"/>
    <property name="Description" type="String" not-null="true" update="false" insert="false"/>
    <property name="CategoryId" type="Int32" not-null="true" update="false" insert="false"/>
    <property name="ContentProviderId" type="Int32" not-null="true" update="false" insert="false"/>
    <property name="LocationId" type="Int32" not-null="true" update="false" insert="false"/>
    <property name="Latitude" type="Double"  update="false" insert="false" />
    <property name="Longitude" type="Double"  update="false" insert="false" />

    <bag name="Events" table="VolatileEventContent" where="DeactivatedOn IS NULL" order-by="StartDate DESC" lazy="false" cascade="none">
      <key>
        <column name="LocationId"></column>
        <column name="ContentProviderId"></column>
        <!--<column name="LocationId"></column>
        <column name="ContentProviderId"></column>
        <column name="CategoryId"></column>-->
      </key>
      <one-to-many class="Event" column="VolatileEventContentId"></one-to-many>
    </bag>

  </class>
</hibernate-mapping>

および VolatileEventContent マッピング ファイル

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="JeanieMaster.Domain.Entities" assembly="JeanieMaster.Domain">
  <class name="Event" table="VolatileEventContent" select-before-update="false" optimistic-lock="none">
    <composite-id>
      <key-property name="LocationId" type="Int32"></key-property>
      <key-property name="ContentProviderId" type="Int32"></key-property>
    </composite-id>

    <property name="Description" type="String" not-null="true" update="false" insert="false"/>

    <property name="StartDate" type="DateTime" not-null="true" update="false" insert="false" />
    <property name="EndDate" type="DateTime" not-null="true" update="false" insert="false" />

    <property name="CreatedOn" type="DateTime" not-null="true" update="false" insert="false" />
    <property name="ModifiedOn" type="DateTime" not-null="false" update="false" insert="false" />

    <many-to-one name="Location" class="Location" column="LocationId" />

    <bag name="Artistes" table="EventArtiste" lazy="false" cascade="none">
      <key name="VolatileEventContentId" />
      <many-to-many class="Artiste" column="ArtisteId" ></many-to-many>
    </bag>
  </class>
</hibernate-mapping>
4

3 に答える 3

2

エラーは正しいです。SchemaExport受け取ったエラーは、テーブルと外部キーの作成中に発生するように聞こえるため、NHibernate マッピングに基づいてテーブルを生成するために 使用していると思います。SchemaExport次のような表が生成されます (コード全体に散らばっている説明に注意してください)。

CREATE TABLE LocationSearchView (
    LocationId int NOT NULL,
    ContentProviderId int NOT NULL,
    CategoryId int NOT NULL,

    /* ...other columns... */

    /* Note: Generated from LocationSearchView's "composite-id" element.  */
    PRIMARY KEY (LocationId, ContentProviderId, CategoryId)
);

/* Note: Table for the "Event" class. */
CREATE TABLE VolatileEventContent (
    LocationId int NOT NULL,
    ContentProviderId int NOT NULL,

    /* ...other columns... */

    /* Note: Generated from Event's "composite-id" element. */
    PRIMARY KEY (LocationId, ContentProviderId),
    /* Note: Generated from the "key" element of LocationSearchView's Events bag. */
    FOREIGN KEY (LocationId, ContentProviderId) REFERENCES LocationSearchView (LocationId, ContentProviderId)
);

...したがって、エラー。外部キーは、主キーの一部だけでなく、完全な主キーまたは一意のキーを指している必要があります。キー全体は 2 列ではなく 3 列です。NHibernate がこれらの列を外部キーに使用するのはなぜですか? バッグ の<key>要素があるので。子からに戻る列を指定します。LocationSearchViewEvents<key>

あなた (または NHibernate) がこれらのテーブルから選択しようとするとどうなるか考えてみましょう。次のデータを想定します。

TABLE LocationSearchView
LocationId ContentProviderId CategoryId
========== ================= ===========
1 3 5
1 3 6
1 4 5
1 4 6
2 3 5
2 3 6
2 4 5
2 4 6
TABLE VolatileEventContent
LocationIdContentProviderId
========== =================
1 3
1 4
2 3
2 4

"one"LocationSearchViewが "many" を持つことはできませんEvent。むしろ、逆であるべきです。Eventこれらのテーブルを考えると、実際には からへの 1 対多の関係がありLocationSearchViewます。

あなたが何を達成しようとしているのかわからないので、この問題の正しい解決策はわかりませんが、これが問題の正確な内容を明らかにするのに役立つことを願っています.

于 2010-03-20T15:32:05.893 に答える
0

私は nhibernate を使用したことはありませんが、マッピングは hibernate のものと非常に似ていると思います。

1 対多 (LocationSearchView 対多の VolatileEventContent) 関連付けで LocationSearchView id を使用したくない場合は、バッグのキー要素で、使用するプロパティを定義する属性「property-ref」を定義する必要があります。代わりは :

<bag name="Events" table="VolatileEventContent" ...>
  <key property-ref="partialId">
    <column name="LocationId"></column>
    <column name="ContentProviderId"></column>
  </key>
  <one-to-many class="Event" column="VolatileEventContentId"></one-to-many>
</bag>

(列属性は一対多タグで有効ですか?)

次に、その名前のプロパティを次のように定義する必要があります。

<properties name="partialId" insert="false" update="false">
  <property name="LocationId" type="Int32" update="false" insert="false"/>
  <property name="ContentProviderId" type="Int32" update="false" insert="false"/>
</properties>

LocationId と ContentProviderId は既に定義されています。これら 2 つのプロパティをプロパティ要素内に移動するだけです。

于 2010-03-20T11:30:38.123 に答える
0

まず、" " のマッピングにエラーがあります。列をプロパティと Composite-id の両方としてLocationSearchView定義します。CategoryIdこれは間違っていますが、残念ながら、マッピングを構築するときにキャッチされず、通常はオブジェクトをクエリするときに公開されます。IndexOutOfRangeException をチェックするNHibernate の奥深くにある

マッピング パーサーを混乱させる可能性があります。そして、あなたのマッピングの両方で、より統制のとれたプログラミング方法論を意味するリフレクションとコンベンションに依存しているため、私は混乱していると言っています。

  1. and要素のclass属性を明示的に定義するのではなく、NHibernate がクラス定義自体からクラス タイプを検出することを期待します。万が一クラスに設定した場合、次のnhibernateは定義されたクラスを見つけることを期待するため、コレクションをマップするために3つの列が必要になりますmany-to-onebagLocationSearchViewIList<LocationSearchView> Events {get;set;}LocationSearchViewbag
  2. 列名に同じプロパティ名を使用すると、開発が容易になります (実際には、とにかく 1 回か 2 回だけ作成するマッピングの作成が簡単になります) が、エラーや変更が発生した場合、何が問題なのかを検出するのが難しくなります。

したがって、マッピングをよりリッチにして、私が言及したエラーを削除しCategoryId、投稿にクラスも含めてください!

于 2010-03-26T10:11:35.273 に答える