NHibernate SysCache2 - 依赖性中断缓存

时间:2014-05-14 13:57:50

标签: c# sql nhibernate sqldependency syscache2

公司类:

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缓存区域中的其他实体(从不更改,想到国家等)都可以缓存。另一方面,公司不是。

1 个答案:

答案 0 :(得分:2)

解决方案包括解决多个问题:

  1. IntProp在表上可以为空,属性不可为空int。这导致NHibernate在获取行时无法设置NULL,因此属性值变为0.当会话刷新时,它看到一个修改(NULL为0)并抛出有关修改只读数据的异常。 (这是NH设计缺陷,IMO)

  2. 依赖关系查询SELECT所有列(*),依赖性机制不支持。相反,必须列出每列。 (这悄然失败,这也是一个SQL设计漏洞,IMO)

  3. 依赖项查询FROM子句具有表名,但省略了模式名称,这也是不受支持的。添加dbo.修复它。我花了4个小时才发现这个。 (再次,安静的失败,SQL缺陷)

  4. 进入生产线后,出现用户权限错误。可以通过http://social.technet.microsoft.com/Forums/exchange/en-US/99321f54-1fef-4860-9fe9-5966a46fe582/once-for-all-right-permissions-for-sqldependency-please

  5. 修复这些问题

    希望这有助于某人。

    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>