公司类:
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缓存区域中的其他实体(从不更改,想到国家等)都可以缓存。另一方面,公司不是。
答案 0 :(得分:2)
解决方案包括解决多个问题:
IntProp在表上可以为空,属性不可为空int。这导致NHibernate在获取行时无法设置NULL,因此属性值变为0.当会话刷新时,它看到一个修改(NULL为0)并抛出有关修改只读数据的异常。 (这是NH设计缺陷,IMO)
依赖关系查询SELECT所有列(*),依赖性机制不支持。相反,必须列出每列。 (这悄然失败,这也是一个SQL设计漏洞,IMO)
依赖项查询FROM子句具有表名,但省略了模式名称,这也是不受支持的。添加dbo.
修复它。我花了4个小时才发现这个。 (再次,安静的失败,SQL缺陷)
进入生产线后,出现用户权限错误。可以通过http://social.technet.microsoft.com/Forums/exchange/en-US/99321f54-1fef-4860-9fe9-5966a46fe582/once-for-all-right-permissions-for-sqldependency-please
希望这有助于某人。
PS。根据请求,最终结果:
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>