1

nhibernateに非常に単純な問題があります(使い始めたばかりです)

私は次のhbmマッピングファイルを持っています:

<class name="Customer" table="Customers" lazy="false">
<id name="Id" column="CustomerId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Orders" cascade="all-delete-orphan" lazy="false">
  <key column="CustomerId" />
  <one-to-many class="Order" />
</bag>
</class>

<class name="Order" table="Orders" lazy="false">
<id name="Id" column="OrderId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Products" cascade="all-delete-orphan" lazy="false"
  <key column="OrderId" />
  <one-to-many class="Product" />
</bag>
</class>

<class name="Product" table="Products" lazy="false">
<id name="Id" column="ProductId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<property name="ProductStr" />
</class>

Customerクラスには、int id、文字列名、byte []画像、およびIListofOrdersがあります。

Orderクラスには、int id、文字列名、byte []画像、および製品のIListがあります。

製品クラスには、int id、文字列名、byte []画像、文字列productstr、およびint数量(現在は使用していません)があります。

顧客テーブルには、顧客ID、名前、および画像(varbinary(max))があります。

注文には注文ID、名前、写真、顧客IDがあります

製品には、製品ID、名前、画像、productstr、および注文IDがあります。

問題:session.Delete(csCustomer)を使用して顧客を削除すると、顧客全体がデータベースから正常に削除されますが、すべての注文が削除されるわけではありません。削除された顧客のすべての注文の顧客IDフィールドにnullを入力するだけです。

誰でも私の構成に問題を見つけることができますか?nhibernateを使用して、注文クラスの顧客への参照と製品クラスの注文への参照を保存した例を見ましたが、それを修正するには何かする必要がありますか?

4

1 に答える 1

3

inverse="true"バッグにセットする必要があります。

顧客マッピングは次のようになります。

<class name="Customer" table="Customers" lazy="false">
<id name="Id" column="CustomerId">
    <generator class="native">
</id>
<property name="Name" />
<property name="Picture" type="BinaryBlob" />
<bag name="Orders" cascade="all-delete-orphan" inverse="true" lazy="false">
  <key column="CustomerId" />
  <one-to-many class="Order" />
</bag>
</class>

ここにこのプロパティに関する良い記事があり、Ayende はずっと前にそれについて書いています。

追加する顧客を参照して注文マッピングを拡張することをお勧めします:

<many-to-one name="Customer" column="CustomerId" not-null="true"/>

クラスに仮想プロパティを追加します。

public virtual Customer Customer { get; set; }

ここにいくつかの詳細情報があります。

考慮すべきもう 1 つのことは、ここで説明されているように、バッグが重複を許可するためbag、原因を変更することです。set

また、カプセル化を使用してドメインを強化することもできます。

于 2013-01-07T17:24:07.470 に答える