class Company {
public virtual int Id { get;set;}
public virtual string Name { get;set;}
public virtual int IntProp { get;set;}
}
公司表:
CREATE TABLE Companies (
Id INT PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
IntProp INT NULL );
这是我的web.config:
<syscache2>
<cacheRegion name="RefData"></cacheRegion>
<cacheRegion name="Company">
<dependencies>
<commands>
<add name="CompanyCommand"
command="SELECT * FROM Companies WHERE Deleted = 0"
/>
</commands>
</dependencies>
</cacheRegion>
</syscache2>
问题:RefData缓存区域中的其他实体(从未更改,认为国家等)被缓存得很好。而公司则不然。
解决方案包括解决多个问题:
-
IntProp在表上是可空的,并且property不是可空的。这导致NHibernate无法在获取一行时设置null,因此属性值变为0。当会话刷新时,它看到一个修改(NULL到0),并抛出关于修改只读数据的异常。(这是NH设计缺陷,IMO)
-
依赖查询选择所有列(*),这是依赖机制不支持的。相反,必须列出每一列。(这悄悄地失败了,这又是一个SQL设计缺陷,IMO)
-
依赖项查询FROM子句有表名,但省略了模式名,这也是不支持的。添加
dbo.
修复了它。我花了4个小时才找到这个。 -
进入生产车道后,出现用户权限错误。这些可以通过以下方式修复http://social.technet.microsoft.com/Forums/exchange/en-US/99321f54-1fef-4860-9fe9-5966a46fe582/once-for-all-right-permissions-for-sqldependency-please
希望这能帮助到一些人。
p。每个请求,最终结果:
class Company {
public virtual int Id { get;set;}
public virtual string Name { get;set;}
public virtual int? IntProp { get;set;}
}
<syscache2>
<cacheRegion name="RefData"></cacheRegion>
<cacheRegion name="Company">
<dependencies>
<commands>
<add name="CompanyCommand"
command="SELECT Id, Name, IntProp FROM dbo.Companies WHERE Deleted = 0"
/>
</commands>
</dependencies>
</cacheRegion>
</syscache2>