【问题标题】:NHibernate SysCache2 - dependency breaks cacheNHibernate SysCache2 - 依赖关系中断缓存
【发布时间】:2014-05-14 13:57:50
【问题描述】:

公司类:

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

【问题讨论】:

    标签: c# sql nhibernate sqldependency syscache2


    【解决方案1】:

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

    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-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>
    

    【讨论】:

    • 太棒了。感谢您,感谢您分享您的经验。
    • 请注意,“安静”的故障在现实中非常响亮。 SQL Server 将通过立即使带有 Info 的查询无效来抱怨 InvalidSource 将是 Statement。您的应用是否忽略了它们...
    • @RemusRusanu 是和不是。是的,SQL 提供了一定的反馈来表明依赖失败,不,它不够“响亮”,所以它仍然是“安静的”。从我的上下文中可以明显看出,NH SysCache2 环绕它(就像任何其他 ORM/DAL 一样)。如果 SQL 抛出异常,它就会冒泡给调用者。相反,它依赖于“返回值”方法——我仍然认为这是一个缺陷。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多