1

私はNHibernateを初めて使用し、ZeroToOne関係をマッピングする方法がわかりません。

関係する3つのテーブルがあります

Discounts
DiscountRequests
Requests

両方の主キーがペアとしてに保存されますDiscountRequests。すべての割引にリクエストがあるわけではなく、すべてのリクエストに割引があるわけでもありません。

各主キーは1回だけ表示されるDiscountRequestsためDiscount、と1対1の関係がDiscountRequestsあり、それは。と同じですRequests

誰もがこれをマップする方法を知っているので、Discountオブジェクトは、リクエストがある場合はそのリクエストへの参照を保持でき、Requestオブジェクトはある場合はDiscountへの参照を保持できます。それ以外の場合は、nullオブジェクトを保持します。

4

1 に答える 1

4

これは、古典的な1対1ではないため、興味深い関係のケースです。関係の所有者である一方の側がありません。これは、例のように、間接的な「多対多」テーブルが必要であることを意味します。最も簡単な解決策は、NHibernateでコレクションとしてマップすることですが、ドメイン内に複数のアイテムを含めることができない場合、それは奇妙です。

しかし、助けるための結合があります。結合マッピングを使用すると、ドメインオブジェクトに対して透過的な方法で、1つのエンティティを複数のデータベーステーブルに分割できます。Discountこれで、マッピングに次のようなものを含めることができます。

<join table="DiscountRequests" optional="true">
    <key column="DiscountId" />
    <many-to-one name="Request" column="RequestId" />
</join>

そしてRequest側面の同様のもの:

<join table="DiscountRequests" optional="true">
    <key column="RequestId" />
    <many-to-one name="Discount" column="DiscountId" />
</join>

事実上、それはDiscountRequestsテーブルが2つに分割され、への参照がRequestそれぞれDiscountオブジェクトとその逆に移動したようなものです。

RequestId両方に固有の制約があることを忘れないでくださいDiscountId。これにより、複数の行が結合される可能性がなくなります。

また、プロファイラーを使用した保存と更新に悪影響がないことも確認しますが、影響はないと思います。

于 2013-02-13T20:54:57.037 に答える