4

いくつかの情報源は、NHibernate が具象クラスおよび共用体サブクラスごとのテーブルで ID を使用できないと述べています。これは本当ですか?この背後にある正確な理由は何ですか?

4

2 に答える 2

4

それは簡単です。POID は、ルート エンティティ タイプのすべてのインスタンスで一意である必要があります。

次の例を検討してください。

abstract class Vehicle { ... }
class Car : Vehicle { ... }
class Truck : Vehicle { ... }

具体的な型がわからないVehicle を取得する場合:

var carOrTruck = session.Get<Vehicle>(vehicleId);

...そして、その ID を持つ車とトラックの両方がありました (これは ID で可能です)。NHibernate はどちらを返しますか? (もっと複雑なケースもありますが、これは 1 つの考えられる問題を示しています)

したがって、table-per-concrete-class (私に言わせればかなり悪い戦略です) の場合、NHibernate はサブクラス全体で一意性を保証するジェネレーターを必要とします。

于 2012-02-02T16:42:20.290 に答える
1

なぜそう言うのですか?そんなシチュエーションがいくつもあったと思います。また、このブログエントリは同じことを述べています。

以下のコメントを要約すると: Ayende が持っている例のように、すべてのルート タイプをクエリすると (つまり、「Select Party」)、ID の重複を取得できます。この事実と UNION 特性 (個別のレコードのみを返す) により、予期しない結果 (レコードの欠落) が生じる可能性があります。そのため、ID を使用できず、nhibernate が重複を回避できるようにする hilo を使用できます。

于 2012-02-02T10:23:17.450 に答える