NHibernate almacenamiento en caché de objetos en función de identificación de clase principal
-
13-09-2019 - |
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?
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.