2

NHibernate3を使用して休閑マッピングを宣言しました。

FluentNHibernateを使用

public class ActivityMap : ClassMap<Activity> {
    public ActivityMap() {
        this.Table("Activity");
        this.Cache.ReadWrite();
        this.Version(x => x.ObjectVersion);
        this.Id(x => x.Id).GeneratedBy.Assigned();

        // snipp

        this.HasOne(x => x.AppointmentRecurrence).Cascade.Delete();
    }
}

public class AppointmentRecurrenceMap : ClassMap<AppointmentRecurrence> {
    public AppointmentRecurrenceMap() {
        this.Table("AppointmentRecurrence");
        this.Cache.ReadWrite();     
        this.Version(x => x.ObjectVersion);
        this.Id(x => x.Id).GeneratedBy.Foreign("Activity");

        // snipp

        this.HasOne(x => x.Activity).Constrained();
    }
}

これは休眠中のhbm-mappingを生成しています:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" lazy="false" name="Prayon.Entities.Activity, Prayon.Entities, Version=1.0.0.867, Culture=neutral, PublicKeyToken=null" table="Activity">
    <cache usage="read-write" />
    <id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="assigned" />
    </id>
    <!-- snipp -->
    <one-to-one cascade="delete" class="Prayon.Entities.AppointmentRecurrence, Prayon.Entities, Version=1.0.0.867, Culture=neutral, PublicKeyToken=null" foreign-key="FK_Activity_AppointmentRecurrence" name="AppointmentRecurrence" />
  </class>
</hibernate-mapping>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" lazy="false" name="Prayon.Entities.AppointmentRecurrence, Prayon.Entities, Version=1.0.0.867, Culture=neutral, PublicKeyToken=null" table="AppointmentRecurrence">
    <cache usage="read-write" />
    <id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="foreign">
        <param name="property">Activity</param>
      </generator>
    </id>
    <!-- snipp -->
   <one-to-one class="Prayon.Entities.Activity, Prayon.Entities, Version=1.0.0.867, Culture=neutral, PublicKeyToken=null" constrained="true" foreign-key="FK_AppointmentRecurrence_Activity" name="Activity" />
  </class>
</hibernate-mapping>

ここで、アクティビティを(cachable-selectを使用して)選択すると、NHibernate-Profilerで、NHibernateが各アクティビティを第2レベルのキャッシュから正しく取得していることがわかりますが、各アクティビティに対してAppointmentReccurrenceへの選択が行われます。キャッシュからもAppointmentReccurrenceを取得するにはどうすればよいですか?1対1の関係にキャッシュ属性を設定しようとしましたが、サポートされていないようです。

4

1 に答える 1

0

Constrainedマッピングの側面に問題があるようです。Ayendeの1対1のガイドによると:

他に注意すべき点は、これをforeign-key =” none”で指定する必要があることです。そうしないと、NHibernateのスキーマエクスポート機能によって2つの外部キーが作成され、循環参照が作成され、何も挿入できなくなります。データベース。

明らかに、FKは実際にはデータベースに存在しませんが、構成の誤りにより、キャッシュに問題が発生する可能性があります。

foreign-key="none"Fluentで指定する方法:

this.HasOne(x => x.Activity).Constrained().ForeignKey();
于 2012-10-20T03:05:19.907 に答える