1

私は NHibernate 3.2 と appfabric 1.1 を第 2 レベルのキャッシュに使用しています。同じテーブルに 2 つのクラスをマップしました。最初のクラスAFullEntity (サンプルでは MonitorLayoutData) は、軽量クラス (MonitorLayout) である 2 番目のクラスを継承します。MonitorLayoutData には、基本クラスには存在しない重いプロパティが含まれています。例えば ​​:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Entities.MonitorLayout,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit">
    <cache usage="nonstrict-read-write"/>
    <id name="Id" column="MonitorLayout_ID" type="int">
      <generator class="native" />
    </id>
    <property name="Name" column="MonitorLayout" type="string" />
    <property name="UserId" column="User_ID" type="int" />
    <property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" />
    <property name="ViewGuid" column="ViewGuid" type="string" not-null="true" />
    <property name="TreeNode" column="TreeNode" type="string" />
    <property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" />

  </class>

  <class name="Entities.MonitorLayoutData,Entities" table="MonitorLayouts2" lazy="false" schema="dbo" polymorphism="explicit">
    <cache usage="nonstrict-read-write"/>
    <id name="Id" column="MonitorLayout_ID" type="int">
      <generator class="native" />
    </id>
    <property name="Name" column="MonitorLayout" type="string" />
    <property name="UserId" column="User_ID" type="int" />
    <property name="IsPublic" column="IsPublic" type="Boolean" not-null="true" />
    <property name="ViewGuid" column="ViewGuid" type="string" not-null="true" />
    <property name="TreeNode" column="TreeNode" type="string" />
    <property name="IncludeNodeChildren" column="IncludeNodeChildren" type="Boolean" />
    <property name="LayoutData" column="LayoutData" type="BinaryBlob" not-null="false"/>
  </class>
</hibernate-mapping>

これらのクラスは、明示的なポリモーフィズムを使用して、ドキュメントのメモのように、選択したタイプのエンティティのみを取得します。「明示的なポリモーフィズムは、2 つの異なるクラスが同じテーブルにマップされている場合に役立ちます (これにより、テーブルのサブセットを含む「軽量」クラスが可能になります)。列)」。

ただし、エンティティがキャッシュされると問題が発生しました。AFullEntity を更新すると、軽量クラスで変更が報告されず、これは大きな問題です。サブクラスやエクステンドなどの他のメカニズムを試してみましたが、NHibernate は私には必要のない識別子要素を宣言するように強制します。

これを行う方法はありますか?

4

1 に答える 1

0

いいえ、これらは 2 つの別個のオブジェクトであり、それぞれがキャッシュ内に独自の ID を持っています。考えられる回避策は、軽量オブジェクトのキャッシュを無効にするか、重いオブジェクトがロードされたときに軽量オブジェクトをキャッシュから削除することです。同じセッションで重いオブジェクトと軽いオブジェクトをロードすると、目的が果たされないように思えます。

于 2012-11-30T14:07:33.120 に答える