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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top