NHibernate Caching oggetti basati su ID di classe padre
-
13-09-2019 - |
Domanda
Ho le seguenti definizioni per i tipi di animali e del cane. Si noti che l'ID per l'oggetto è l'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>
Diciamo che ho le seguenti informazioni nel mio database:
in table Animals:
AnimalID IsBig
-------- -----
10 True
in table Dogs:
AnimalID OwnerID IsStrong
-------- ------- --------
10 1 True
10 2 False
In primo luogo, ho Domanda per il cane dove ownerid = 1. Nella stessa sessione, ho Domanda per il cane dove ownerid = 2. A causa della cache di sessione di NHibernate, la seconda query restituisce un oggetto Dog dove ownerid = 1 e IsStrong = è vero, dove dovrebbe restituire un oggetto Dog dove ownerid = 2 e IsStrong = false.
NHibernate memorizza automaticamente gli oggetti dal loro ID di colonna (chiave primaria), così richiedendo il Cane la seconda volta finisce recuperato un oggetto con la stessa chiave. Posso risolvere questo problema chiamando ISession.Evict () sull'oggetto, ma che sembra un hack.
Qualche suggerimento migliore?
Soluzione
È necessario assicurarsi che si sta utilizzando chiavi diverse per le diverse istanze. Nel tuo caso si sta effettivamente violare questa regola:. Tabella Cani espone parti del due condividendo la stessa chiave
Quindi Dogs.AnimalID deve essere contrassegnati come chiave primaria, ma nel tuo caso non è. Se dovesse essere contrassegnato come PK, non si poteva ottenere tali contenuti a tutti.
Altri suggerimenti
Per quanto riguarda, la domanda che dovrebbe porci è "come faccio a modello di questo correttamente?"
La tabella Cani dice che cane 10 è di proprietà dal proprietario 1 ed è forte, ma, allo stesso tempo , il cane 10 è di proprietà dal proprietario 2 e non è forte.
In qualche modo, non penso che sia quello che volevi dire.
Se si spiegare più in dettaglio quello che stai cercando di modello, forse possiamo fare alcuni suggerimenti.
Fai AnimalID e ownerid una chiave primaria composta.