4

NHibernate で多対 1 の関係をモデル化しようとすると問題が発生します。この場合、「1」側のオブジェクトは列に一意の制約があります。問題は次のとおりです。

「Person」と「Country」の 2 つのテーブルがあります。各人物には、関連付けられている国が 1 つだけあります。国は多くの人を持つことができ (本当に! :))、国名は一意です。Person 側のマッピングは次のとおりです。

<many-to-one Name="Country">
<column Name="CountryId"/>
</many-to-one>

国側:

<property name="Name" unique="true">
<column name="Name" length="50">
</property>

データベースで、Country テーブルの Name 列に一意の制約を追加しました。Person インスタンスで Save() を呼び出すと、NHibernate は単に INSERTS を実行しようとしますが、Country Name が存在するかどうかを確認し、Person テーブルの CountryID 列でその ID を使用することを期待します。代わりに、データベース内の一意の制約に違反した結果として例外がスローされます。

私には、Nibernate が正しいことを行うのに十分なマッピング メタデータを持っている必要があるように思えます (または、プロパティの一意の属性がこれを保証していませんか?)。誰かがこれを行う方法を知っているか、回避策を持っていますか?

ありがとう、

マルティン

4

2 に答える 2

6

Country インスタンスを Person インスタンスの Country プロパティに割り当てる必要があります (ID を設定するだけではありません)。何かのようなもの:

Person p = new Person();
p.Country = session.Load<Country>(countryId);
session.Save(p);

その後、NHibernate は何をすべきかを認識します。Load メソッドは Country プロキシを返し、アクセスしているのは Country インスタンスの ID だけであるため、これによって DB ヒットが国を取得することもありません。

于 2008-11-14T21:40:56.610 に答える
0

同様の要件があり、SaveOrUpdateCopyを使用して解決しました。

2 つの異なる People オブジェクトがあり、それぞれが異なる Country オブジェクトへの参照を持っているとします。国IDが同じである限り、例外は発生せず、データベースには 1 つの国のみが存在します。

このアプローチの唯一の点は、SaveOrUpdateCopy を呼び出す前に、Country オブジェクトに ID を割り当てる必要があることです。

于 2009-09-14T08:31:10.563 に答える