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 и НЕ является сильной.

Почему-то я не думаю, что ты это имел ввиду.

Если вы объясните более подробно, что вы пытаетесь смоделировать, возможно, мы сможем внести некоторые предложения.

Сделайте AnimalID и OwnerID составным первичным ключом.

Другие вопросы по тегам