我对 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。
有更好的建议吗?