1

我对 Animal 和 Dog 类型有以下定义。请注意,对象的 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 的 Dog。在同一个会话中,我查询 OwnerID = 2 的 Dog。由于 NHibernate 的 Session 缓存,第二个查询返回了 OwnerID = 1 且 IsStrong = True 的 Dog 对象,其中它应该返回一个 Dog 对象,其中 OwnerID = 2 且 IsStrong = False。

NHibernate 自动通过 ID(主键)列缓存对象,因此第二次请求 Dog 最终会检索到具有相同键的对象。我可以通过在对象上调用 ISession.Evict() 来解决这个问题,但这似乎是一个 hack。

有更好的建议吗?

4

3 回答 3

1

您必须确保为不同的实例使用不同的密钥。在您的情况下,您实际上违反了此规则: Dogs 表公开了共享相同 key的两个实例的部分。

所以 Dogs.AnimalID必须标记为主键,但在你的情况下它不是。如果它被标记为PK,你根本无法获得这样的内容。

于 2009-12-08T20:35:44.363 回答
1

恕我直言,您应该问的问题是“我如何正确建模?”

你的 Dogs 表显示狗 10 归所有者 1 拥有并且很强壮,但同时,狗 10 归所有者 2 所有并且不强壮。

不知何故,我不认为这就是你的意思。

如果您将更详细地解释您要建模的内容,也许我们可以提出一些建议。

于 2009-12-09T00:39:03.687 回答
0

使 AnimalID 和 OwnerID 成为复合主键。

于 2009-12-07T04:26:32.807 回答