1

Nhibernate での二次キャッシュの実装に問題があります。次のようにマップされたクラスがあります。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data">
   <class name="Account" table="Accounts" lazy="false">
     <cache region="Standard" usage="read-write" include="all"/>
     <id column="ID" name="ID">
       <generator class="assigned" />
     </id>
     <version name="VersionStamp" column="VersionStamp" type="integer" unsaved-value="0" />
     <property name="Name" not-null="true" />
     <property name="Type" not-null="true" />
     <property name="ClientID" not-null="true" insert="false" update="false" />
     <property name="DateCreated" not-null="true" type="UtcDateTime" />
     <property name="LastUpdatedDate" not-null="true" type="UtcDateTime" />
     <property name="IsActive" not-null="true" />
     <many-to-one name="Client" class="Client" column="ClientID" not-found="exception" not-null="true" />
   </class>
 </hibernate-mapping>

プロパティ "ClientID" は Clients テーブルへの外部キーであり、多対 1 のクライアント プロパティはそれを使用して、関連するクライアント オブジェクトを検索します。

新しい Account を追加するときは、Session.Get を使用してデータベースから Client オブジェクトを検索し、それを Account オブジェクトの Client プロパティに割り当てます。バックグラウンドでは、オブジェクトがデータベースに書き込まれるときに ClientID プロパティも自動的に設定され、ID がデータベースに正しく格納されます。Session.Get を使用して ID でデータベースから Account オブジェクトを取得すると、オブジェクトの取得時にすべてのフィールドが正しく入力されます。

ただし、上記の設定を使用して第 2 レベルのキャッシュを実装すると、Session.Get を使用して Account オブジェクトを取得するときに ClientID プロパティは設定されませんが、Client プロパティは正しく設定されます。これが二次キャッシュで機能しない理由はありますか? または、マッピング/構成で何か間違ったことをしましたか?

今のところ、キャッシュ プロバイダーとして SysCache を使用しているだけで、クエリと 2 次キャッシュの両方がオンになっています。クライアント クラス マッピングには、アカウントの対応する 1 対多のプロパティが含まれています。

Account クラスに ClientID プロパティがあると便利なので、Client プロパティを使用せずに読み取ることができ、キャッシュしなくても問題なく動作するようです。

助けてくれてありがとう。

リッチ

4

1 に答える 1

0

あなたの状況をローカルで再現しようとしました。マッピング(上記のスニペットと同じように使用)を使用すると、 でのみ誤った動作をすることができましたUPDATE。その場合、ClientIDはキャッシュされ、Client参照が変更されても は変更されClientIDませんでした。他のケースでは、キャッシングは期待どおりに機能していました。

解決策は、マッピングを変更することです。以下に提案するマッピングは、ClientID などの読み取り専用プロパティに最も適しています。(私もそのアプローチを使用しています)。

<property name="ClientID" formula="[ClientId]" 
        not-null="true" insert="false" update="false" />

したがって、トリックはformula代わりにマッピングにありColumnます(何も提供されていない場合のデフォルト)

于 2012-11-15T06:00:02.613 に答える