具有二级缓存的NHibernate未重新水化标记为insert=”的属性;假;更新=";假;?

具有二级缓存的NHibernate未重新水化标记为insert=”的属性;假;更新=";假;?,nhibernate,nhibernate-caches,Nhibernate,Nhibernate Caches,在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"> <cach

在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”是客户机表中的外键,客户机多对一属性使用它查找关联的客户机对象

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

但是,当我使用上面所示的设置实现二级缓存时,当使用Session.Get检索Account对象时,不会填充ClientID属性,但是正确填充了Client属性。是否有某些原因导致二级缓存不起作用?或者我的映射/配置是否有问题

目前,我只是使用SysCache作为缓存提供程序,并且查询和二级缓存都处于启用状态。客户机类映射包含帐户对应的一对多属性

我喜欢在我的Account类中使用ClientID属性的便利性,这样我就可以在不使用Client属性的情况下读取它,而且在没有缓存的情况下它似乎工作得很好

谢谢你的帮助


里奇

我试图在当地再现你的情况。通过您的映射(与上面的代码片段相同),我只能在
UPDATE
上获得不正确的行为。在这种情况下,
ClientID
被缓存,当
Client
引用被更改时,
ClientID
保持不变。在其他情况下,缓存按预期工作

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



因此,诀窍在于
公式
映射,而不是
(没有提供时的默认值)

谢谢,Radim。这似乎解决了问题。我假设字段名周围的[]是公式所必需的。[]是否可以用于所有数据库,或者如果更改后端数据库,是否需要指定不同的公式?是的,以具有不同的映射!;)我在连接MS SQL Server时使用它。但不确定它是否会对其他DB引擎造成损害。太好了,它帮了我!;)
<property name="ClientID" formula="[ClientId]" 
        not-null="true" insert="false" update="false" />