1

Animal と Dog のタイプについては、次の定義があります。オブジェクトの ID は AnimalID であることに注意してください。

<class name="Animal" table="Animals">
    <id name="Id" type="System.Int32" column="AnimalID">
        <generator class="identity" />
    </id>
    <property name="IsBig" column="IsBig" type="System.Bool" not-null="true" />  
</class>

<joined-subclass name="Dog" table="Dogs" extends="Animal">
    <key column="AnimalID" />
    <property name="OwnerID" column="OwnerID" type="System.Int32" non-null="true" />
    <property name="IsStrong" column="IsStrong" type="System.Bool" non-null="true" />
</joined-subclass>

データベースに次の情報があるとします。

in table Animals:

AnimalID    IsBig
--------    -----
10          True

in table Dogs:

AnimalID    OwnerID    IsStrong
--------    -------    --------
10          1          True
10          2          False

最初に、OwnerID = 1 の Dog をクエリします。同じセッションで、OwnerID = 2 の Dog をクエリします。NHibernate のセッション キャッシュのため、2 番目のクエリは、OwnerID = 1 で IsStrong = True の Dog オブジェクトを返します。 OwnerID = 2 および IsStrong = False の Dog オブジェクトを返す必要があります。

NHibernate は ID (主キー) 列によってオブジェクトを自動的にキャッシュするため、Dog を 2 回目に要求すると、同じキーを持つオブジェクトを取得することになります。オブジェクトで ISession.Evict() を呼び出すことでこの問題を解決できますが、これはハックのようです。

より良い提案はありますか?

4

3 に答える 3

1

ちなみに、あなたが尋ねるべき質問は、「これを正しくモデル化するにはどうすればよいですか?」です。

あなたの犬の表には、犬10は飼い主1が所有していて強いと書かれていますが、同時に、犬10は飼い主2が所有していて、強くはありません。

どういうわけか、それはあなたが意図したことではないと思います。

モデル化しようとしているものをより詳細に説明する場合は、いくつかの提案を行うことができます。

于 2009-12-09T00:39:03.687 に答える
1

インスタンスごとに異なるキーを使用していることを確認する必要があります。あなたの場合、実際にはこのルールに違反しています: Dogs テーブルは、同じキーを共有する2 つのインスタンスの一部を公開します。

したがって、 Dogs.AnimalIDは主キーとしてマークする必要がありますが、あなたの場合はそうではありません。PK とマークされている場合、そのようなコンテンツはまったく取得できません。

于 2009-12-08T20:35:44.363 に答える
0

AnimalID と OwnerID を複合主キーにします。

于 2009-12-07T04:26:32.807 に答える