NHibernate 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. IntProp在表上是可空的,并且property不是可空的。这导致NHibernate无法在获取一行时设置null,因此属性值变为0。当会话刷新时,它看到一个修改(NULL到0),并抛出关于修改只读数据的异常。(这是NH设计缺陷,IMO)

  2. 依赖查询选择所有列(*),这是依赖机制不支持的。相反,必须列出每一列。(这悄悄地失败了,这又是一个SQL设计缺陷,IMO)

  3. 依赖项查询FROM子句有表名,但省略了模式名,这也是不支持的。添加dbo.修复了它。我花了4个小时才找到这个。

  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>

相关内容

  • 没有找到相关文章

最新更新