具有二级缓存的NHibernate未重新水化标记为insert=”的属性;假;更新=";假;?
在Nhibernate中实现二级缓存时遇到问题。我有一个类映射如下:具有二级缓存的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
<?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" />