1

公司等级:

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 缓存区域中的其他实体(永远不会改变,认为国家等)被缓存得很好。另一方面,公司不是。

4

1 回答 1

2

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

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

  2. 依赖查询选择所有列 (*),依赖机制不支持。相反,必须列出每一列。(这悄悄地失败了,这又是一个 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-请

希望这可以帮助某人。

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>
于 2014-05-14T13:57:50.223 回答