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 プロパティを使用せずに読み取ることができ、キャッシュしなくても問題なく動作するようです。
助けてくれてありがとう。
リッチ