0

私のマッピング(それほど罪のない人を保護するために編集され、唖然としました):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
           assembly="MyAssembly, Culture=neutral"
           namespace="MyAssembly" auto-import="false">
  <class name="Customer" table="Customers">
    <id name="Id" access="nosetter.camelcase-underscore" >
      <generator class="assigned"/>
    </id>
    <property name="blah"/>
    ...
    <property name="bleh"/>
    <join table="Addresses" optional="true">
      <key column="Id"/>
      <component name="Address" class="MyAssembly.Address, MyAssembly, Culture=neutral" access="field.camelcase-underscore">
        <property name="Street" />
        <property name="Number" />
      </component>
    </join>
  </class>
</hibernate-mapping>

私がこれをするとき:

Address dir = new Address();
dir.Street = "Foo";
dir.Number = 27;
//// Previously loaded customer
cli.Address = dir;
//// Save repository, commit transaction

これは正常に機能し、新しいアドレスをアドレステーブルに自動的に挿入します。しかし、アドレスを削除したい場合:

//// Previously loaded customer with attached address
cli.Address = null;
//// Save repository, commit transaction  

つまり、Addressesテーブルから行を削除する代わりに、NHibernateは行を更新し、Idを除くすべてのフィールドをnullに設定します。

私のマッピングの何が問題になっていますか?

4

1 に答える 1

1

マッピングが与えられた場合、NHibernate は正しく動作します。join-clause は、単一のオブジェクトが複数のテーブルに分散される場合に使用されます。通常、オブジェクトの各テーブルには常に 1 つの行があります。

一方、コンポーネント マッピングは、きめ細かいオブジェクト モデルが必要であるが、データを所有するクラスと同じテーブルに格納する場合です。プロパティが null の場合、NHibernate は、コンポーネントが使用するすべての列を null に設定する以外に何もできません。コンポーネント列が結合されたテーブルの唯一の非キー列であるという事実は関係ありません。

おそらく、代わりに 1 対 1 のマッピングを探していますか? http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-onetoone

于 2012-09-06T20:49:06.327 に答える