Frage

Ich habe die folgenden Definitionen für die Tier- und Hundetypen. Beachten Sie, dass die ID für das Objekt ist die 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>

Lassen Sie uns sagen, dass ich die folgenden Informationen in der Datenbank haben:

in table Animals:

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

in table Dogs:

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

Zuerst habe ich Abfrage für den Hund, wo OwnerID = 1. In der gleichen Sitzung, die ich für den Hund abfragen, wo OwnerID = 2. Wegen des NHibernate Session-Cache, die zweite Abfrage eines Dog-Objekt zurückgibt, wo OwnerID = 1 und IsStrong = es stimmt, wo es sollte ein Hund-Objekt zurück, wo OwnerID = 2 und IsStrong = false.

NHibernate Caches automatisch Objekte durch ihre ID (Primärschlüssel) Säule, so dass der Hund das zweite Mal endet anfordernden mit dem gleichen Schlüssel ein Objekt abzurufen. Ich kann dieses Problem lösen, indem ISession.Evict () auf dem Objekt aufgerufen wird, aber das scheint wie ein Hack.

Noch bessere Vorschläge?

War es hilfreich?

Lösung

Sie müssen sicherstellen, dass Sie verschiedene Schlüssel für verschiedene Instanzen verwenden. In Ihrem Fall sind zu verletzen Sie tatsächlich diese Regel. Hunde Tisch legt Teile zwei Instanzen den gleichen Schlüssel teilen

So Dogs.AnimalID muss als Primärschlüssel gekennzeichnet werden, aber in Ihrem Fall ist es nicht. Wenn es als PK markiert würden, könnten Sie uns diese Inhalte nicht bekommen überhaupt.

Andere Tipps

Bei allem Respekt, die Frage, die Sie sollte fragen wird: "Wie modelliere ich das richtig?"

Ihre Hunde Tabelle sagt, dass Hund 10 von Inhabern im Besitz 1 und ist stark, aber, zugleich , Hund 10 Privatbesitz 2 und ist nicht stark.

Irgendwie, ich glaube nicht, dass das, was Sie gemeint.

Wenn Sie näher erläutern werden, was Sie zu Modell versuchen, vielleicht können wir einige Vorschläge machen.

Machen Sie AnimalID und ownerID einen zusammengesetzten Primärschlüssel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top