NHibernate Кэширование объектов на основе идентификатора родительского класса - PullRequest
1 голос
/ 04 декабря 2009

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

1 голос
/ 08 декабря 2009

Вы должны убедиться, что используете разные ключи для разных экземпляров. В вашем случае вы на самом деле нарушаете это правило: в таблице Dogs представлены части двух экземпляров , имеющих общий ключ .

То есть Dogs.AnimalID должен быть отмечен как первичный ключ, но в вашем случае это не так. Если он будет помечен как PK, вы вообще не сможете получить такой контент.

1 голос
/ 09 декабря 2009

С уважением, вопрос, который вы должны задать, это "как мне правильно смоделировать это?"

В вашей таблице «Собаки» говорится, что собака 10 принадлежит владельцу 1 и является сильной, но в то же время , собака 10 принадлежит владельцу 2 и НЕ является сильной.

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

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

0 голосов
/ 07 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...