NHibernate Кэширует объекты на основе идентификатора родительского класса
-
13-09-2019 - |
Вопрос
У меня есть следующие определения для типов Животных и Собак.Обратите внимание, что идентификатором объекта является 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 автоматически кэширует объекты по их столбцу ID (первичный ключ), поэтому второй запрос Dog приводит к получению объекта с тем же ключом.Я могу решить эту проблему, вызвав ISession.Evict() для объекта, но это похоже на взлом.
Есть предложения получше?
Решение
Вы должны убедиться, что используете разные ключи для разных экземпляров.В вашем случае вы фактически нарушаете это правило:Стол для собак обнажает части два экземпляры совместное использование одного и того же ключа.
Итак, собаки.Животные должен должен быть помечен как первичный ключ, но в вашем случае это не так.Если бы он был помечен как PK, вы вообще не смогли бы получить такой контент.
Другие советы
С уважением, вопрос, который вы следует вопрос заключается в том, "как мне правильно это смоделировать?"
В вашей таблице Dogs указано, что собака 10 принадлежит владельцу 1 и она сильная, но, в то же время, собака 10 принадлежит владельцу 2 и НЕ является сильной.
Почему-то я не думаю, что ты это имел в виду.
Если вы более подробно объясните, что вы пытаетесь смоделировать, возможно, мы сможем внести некоторые предложения.
Сделайте AnimalID и OwnerId составным первичным ключом.