У меня есть следующие определения для типов животных и собак. Обратите внимание, что идентификатором объекта является 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>
Допустим, в моей базе данных есть следующая информация:
in table Animals:
AnimalID IsBig
-------- -----
10 True
in table Dogs:
AnimalID OwnerID IsStrong
-------- ------- --------
10 1 True
10 2 False
Во-первых, я запрашиваю Dog, где OwnerID = 1. В том же сеансе я запрашиваю Dog, где OwnerID = 2. Из-за кэша сеанса NHibernate второй запрос возвращает объект Dog, где OwnerID = 1 и IsStrong = True, где он должен возвращать объект Dog, где OwnerID = 2 и IsStrong = False.
NHibernate автоматически кэширует объекты по их столбцу идентификатора (первичного ключа), поэтому запрос Dog во второй раз приводит к получению объекта с тем же ключом. Я могу решить эту проблему, вызвав ISession.Evict () для объекта, но это похоже на взлом.
Какие-нибудь лучшие предложения?