0

この NHibernate エラー (タイトル内) へのほとんどすべての参照は、子オブジェクトがまだ親コレクションに含まれている間に削除され、後でそれらを再保存するだけで、「削除」を否定することについて語っています (これはエラーの状態と提案です)オブジェクトを再保存している関連付けからオブジェクトを削除します)。

しかし、私の場合、親レコードの削除中にエラーが発生します(その後、関連付けを介して「子」が削除されるため、エラーが示唆するように、関連付けを削除したくありません)

それが毎回発生した場合は理にかなっていますが、私はこのエラーを断続的に観察するだけで、まったく同じコードを実行しますが、特定のレコードに対してのみ実行します. 他の同一のレコードは条件をトリガーせず、削除が実行されます (常に 1 つCustomerを 2 つのaddress-es で処理します)。

表示するコードと量がわからない。これは私の「親」オブジェクト マッピングです。

CustomerAddress の「複合要素」の「セット」としてマッピングされた OneCustomer-to-ManyAddresses 関係があります。

<class name="Customer" table="Customer">
        <id name="Id" column="[Id]" type="Guid">
            <generator class="guid" />
        </id>
        ...
        <set name="AddressList" lazy="true" table="CustomerAddress" cascade="all-delete-orphan" >
            <key column="[CustomerId]"/>
            <composite-element class="CustomerAddress">
                <parent name="Customer"/>
                <many-to-one name="Address"
                class="Address"
                column="[AddressId]"
                not-null="true"
                cascade="all"/>
                ...
            </composite-element>
        </set>

そして、これは「複合」オブジェクトのマッピングですCustomerAddress:

<class name="CustomerAddress" table="CustomerAddress" >
        <id name="Id" column="[Id]" type="Guid">
            <generator class="guid" />
        </id>
        <many-to-one
            name="Address"
            column="[AddressId]"
            class="Address"
            not-null="true"
            cascade="all"/>

        <many-to-one
            name="Customer"
            column="[CustomerId]"
            class="Customer"
            not-null="true"
            cascade="all"/>
            ...
    </class>

エラーとその断続的な性質の説明は何ですか?

追加情報

さらに調べた後、同じ「アドレス」の子への参照を保持している可能性のある別のコレクションを探したところ、次のマッピングが見つかりました。

<class name="Address" table="Address">
        <id name="Id" column="[id]" type="Guid" >
            <generator class="guid" />
        </id>

        <!-- REMOVING THE FOLLOWING <BAG> SEEMS TO BE FIXING MY ISSUE -->
        <bag name="CustomerAddressList" inverse="true" cascade="none" lazy="false" >
            <key>
                <column name="[AddressId]" />
            </key>
            <one-to-many class="CustomerAddress" />
        </bag>

    </class>

を削除する<bag name="CustomerAddressList"...と、問題が解決するようです。説明?

4

2 に答える 2

1

私は推測するつもりです:

双方向の関連付けがありますが、そのうちの 1 つが非所有者であることを指定していません ("inverse = true" を設定することにより)。

CustomerAddress 関係を次のように変更してみてください。

<class name="CustomerAddress" table="CustomerAddress" >
    <id name="Id" column="[Id]" type="Guid">
        <generator class="guid" />
    </id>
    <many-to-one
        name="Address"
        column="[AddressId]"
        class="Address"
        not-null="true"
        cascade="all"/>

    <many-to-one
        name="Customer"
        column="[CustomerId]"
        class="Customer"
        not-null="true"
        cascade="all"
        inverse="true"
         />
        ...
</class>
于 2013-07-16T02:26:12.300 に答える