NHibernate的缓存基于父类的ID对象(NHibernate Caching Objects

2019-10-18 13:32发布

我对动物和狗的类型定义如下。 需要注意的是该对象的ID是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

首先,我查询狗其中OWNERID = 1。在同一个会话中,我查询狗其中OWNERID = 2。由于NHibernate的会话高速缓存,所述第二查询返回一个Dog对象,其中OWNERID = 1和IsStrong =真,其中它应该返回一个狗对象,其中OWNERID = 2和IsStrong =假。

NHibernate的可以通过ID(主键)柱自动缓存对象,所以请求狗所述第二时间结束检索与所述相同键的对象。 我可以解决通过调用对象上ISession.Evict()这个问题,但是这似乎是一个黑客。

什么更好的建议?

Answer 1:

你必须确保你使用不同的密钥对不同的实例。 在你的情况,你实际上违反这条规则:狗表暴露了两个实例共享相同的密钥的部分。

所以Dogs.AnimalID 必须标记为主键,但在你的情况并非如此。 如果将它标记为PK,你不能让这些内容都没有。



Answer 2:

恕我直言,你应该问的问题是“我怎么正确模拟这个?”

你的狗表说,狗10由所有者1拥有,是强,但在同一时间 ,狗10是由业主拥有2和不强。

不知怎的,我不认为这是你的意思。

如果您将详细什么你试图解释模型,也许我们可以提出一些建议。



Answer 3:

让AnimalID和OWNERID复合主键。



文章来源: NHibernate Caching Objects Based on Parent Class's ID