1

在 Nhibernate 中实现二级缓存时遇到问题。我有一个类映射如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data">
   <class name="Account" table="Accounts" lazy="false">
     <cache region="Standard" usage="read-write" include="all"/>
     <id column="ID" name="ID">
       <generator class="assigned" />
     </id>
     <version name="VersionStamp" column="VersionStamp" type="integer" unsaved-value="0" />
     <property name="Name" not-null="true" />
     <property name="Type" not-null="true" />
     <property name="ClientID" not-null="true" insert="false" update="false" />
     <property name="DateCreated" not-null="true" type="UtcDateTime" />
     <property name="LastUpdatedDate" not-null="true" type="UtcDateTime" />
     <property name="IsActive" not-null="true" />
     <many-to-one name="Client" class="Client" column="ClientID" not-found="exception" not-null="true" />
   </class>
 </hibernate-mapping>

属性“ClientID”是 Clients 表的外键,Client 多对一属性使用它来查找关联的客户端对象。

当我添加一个新帐户时,我使用 Session.Get 从数据库中查找 Client 对象并将其分配给我的 Account 对象的 Client 属性。在后台,当对象被写入数据库时​​,这也会自动填充 ClientID 属性,并且 ID 正确存储在数据库中。当我使用 Session.Get 按 ID 从数据库中检索 Account 对象时,检索对象时所有字段都正确填充。

但是,当我使用上面显示的设置实现二级缓存时,使用 Session.Get 检索 Account 对象时不会填充 ClientID 属性,但会正确填充 Client 属性。是否有某些原因为什么这不适用于二级缓存?还是我在映射/配置中做错了什么?

现在我只是使用 SysCache 作为我的缓存提供程序,并且查询和二级缓存都打开了。Client 类映射包含 Accounts 对应的一对多属性。

我喜欢在我的 Account 类上拥有 ClientID 属性的便利性,这样我就可以在不使用 Client 属性的情况下读取它,而且它似乎在没有缓存的情况下也能正常工作。

谢谢你的帮助。

富有的

4

1 回答 1

0

我试图在本地重现您的情况。使用您的映射(与上面的代码片段相同),我只能在UPDATE. 在这种情况下,ClientID被缓存了,当Client引用改变时,ClientID保持不变。在其他情况下,缓存按预期工作。

解决方案是更改映射。以下建议的映射最适合 ClientID 等只读属性。(我也在使用这种方法)。

<property name="ClientID" formula="[ClientId]" 
        not-null="true" insert="false" update="false" />

所以诀窍在于formula映射而不是Column(没有提供时的默认值)

于 2012-11-15T06:00:02.613 回答