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 はテーブルで NULL 可能でしたが、プロパティは NULL 可能ではありませんでした。これにより、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 に答える