Pregunta

Tengo las siguientes definiciones para los tipos de animales y perros. Tenga en cuenta que el ID del objeto es el 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>

Vamos a decir que tengo la siguiente información en mi base de datos:

in table Animals:

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

in table Dogs:

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

En primer lugar, me consulta para el perro, donde ID_Propietario = 1. En la misma sesión, le consulta para el perro, donde ID_Propietario = 2. Debido a la caché de sesión de NHibernate, la segunda consulta devuelve un objeto de perro donde ID_Propietario = 1 y = IsStrong es cierto, donde debe devolver un objeto Dog, donde ID_Propietario = 2 y IsStrong = False.

NHibernate almacena en caché automáticamente objetos por su ID (clave principal) columna, por lo que solicita el perro de la segunda vez que termina la recuperación de un objeto con la misma clave. Puedo resolver este problema llamando ISession.Evict () en el objeto, sino que parece ser un truco.

Cualquier mejores sugerencias?

¿Fue útil?

Solución

Debe asegurarse de que está utilizando diferentes claves para diferentes casos. En su caso en realidad estás violar esta regla:. Mesa de Perros expone piezas de dos compartir la misma clave

Así Dogs.AnimalID debe será marcado como clave primaria, pero en su caso no lo es. Si se marca como PK, no se podía conseguir tal contenido en absoluto.

Otros consejos

Con respecto, la pregunta que debe hacernos es "¿cómo puedo modelar esto correctamente?"

Su mesa Perros perro dice que 10 es propiedad de propietario y 1 es fuerte, pero, al mismo tiempo , perro 10 es propiedad de propietario 2 y no es fuerte.

De alguna manera, no creo que eso es lo que quería decir.

Si va a explicar con más detalle lo que estás tratando de modelo, tal vez podemos hacer algunas sugerencias.

Hacer AnimalID y ID_PROPIETARIO una clave principal compuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top