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