NHibernate Кэширует объекты на основе идентификатора родительского класса

StackOverflow https://stackoverflow.com/questions/1849195

Вопрос

У меня есть следующие определения для типов Животных и Собак.Обратите внимание, что идентификатором объекта является 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 составным первичным ключом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top