Nhibernate 一对一映射不适用于二级缓存

Nhibernate 一对一映射不适用于二级缓存,nhibernate,caching,fluent-nhibernate,hibernate-mapping,one-to-one,Nhibernate,Caching,Fluent Nhibernate,Hibernate Mapping,One To One,我已经用NHibernate3声明了休耕映射: 含氟纤维酸盐 public class ActivityMap : ClassMap<Activity> { public ActivityMap() { this.Table("Activity"); this.Cache.ReadWrite(); this.Version(x => x.ObjectVersion); this.Id(x => x.I

我已经用NHibernate3声明了休耕映射:

含氟纤维酸盐

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();
    }
}
公共类活动映射:类映射{
公共活动地图(){
本表(“活动”);
this.Cache.ReadWrite();
this.Version(x=>x.ObjectVersion);
this.Id(x=>x.Id).GeneratedBy.Assigned();
//斯尼普
this.HasOne(x=>x.AppointmentRecurrence).Cascade.Delete();
}
}
公共类任命RecurrenceMap:ClassMap{
公共任命复发地图(){
本表(“任命重现期”);
this.Cache.ReadWrite();
this.Version(x=>x.ObjectVersion);
this.Id(x=>x.Id).GeneratedBy.Foreign(“活动”);
//斯尼普
this.HasOne(x=>x.Activity).Constrained();
}
}
正在生成衰减hbm映射的:

<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>

活动
现在,当我选择活动(使用可缓存的选择)时,我在NHibernate探查器中看到,NHibernate正在从二级缓存中正确地获取每个活动,但它将为每个活动执行一个select to AppointReccurrence。我能做什么,它也会从缓存中获取AppointReccurrence?
我已尝试在一对一关系上设置缓存属性,但它似乎不受支持。

您的映射的
受约束方面似乎存在问题。根据Ayende的指南:

另外需要注意的是,我们必须用foreign key=“none”指定它,因为否则NHibernate的模式导出功能将为我们创建两个外键,这将创建一个循环引用,不允许我们向数据库中插入任何内容

显然,FK实际上并不存在于您的数据库中,但错误配置可能会导致缓存出现问题:

在Fluent中指定
foreign key=“none”
的方法:

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

您似乎确实对映射的
约束
端有问题。根据Ayende的指南:

另外需要注意的是,我们必须用foreign key=“none”指定它,因为否则NHibernate的模式导出功能将为我们创建两个外键,这将创建一个循环引用,不允许我们向数据库中插入任何内容

显然,FK实际上并不存在于您的数据库中,但错误配置可能会导致缓存出现问题:

在Fluent中指定
foreign key=“none”
的方法:

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

嗯,这不起作用。ForeignKey()正在数据库上生成密钥。ForeignKey(“none”)将不会-但实体尚未从chache加载:-(您是否尝试显式设置关系上的
.Fetch.Select()
)(来自的随机想法)(老实说,我通常只声明一对一关系,因为我发现一对一有太多的怪癖。)mmhh-这不起作用。ForeignKey()正在数据库上生成一个键。ForeignKey(“无”)将不会-但实体尚未从chache加载:-(您是否尝试在关系上显式设置
.Fetch.Select()
。(来自的随机想法)(老实说,我通常只声明一对一的关系,因为我发现一对一有太多的怪癖。)你确定过解决方案吗?你确定过解决方案吗?