NHibernate在会话之外返回id,但不通过属性返回

时间:2011-09-15 05:45:13

标签: nhibernate lazy-loading getter-setter

我有这样的界面:

public interface ICoreType {
    int TypeID {get;}
}

一个实现它的NHibernate类:

public class DueDateType : ICoreType {
    public virtual int DueDateTypeID {get;set;}
    ...
    public virtual int TypeID { get{ return this.DueDateTypeID; } }
}

这是我的映射:

 <class name="DueDateType" table="tdfDueDateType" lazy="true" >
    <cache usage="read-write" include="all"/>
    <id name="DueDateTypeID" column="DueDateTypeID" >
      <generator class="identity"/>
    </id>
    ...
  </class>

当我从NHibernate获取对象的实例,然后将其返回到创建它的活动会话的范围之外时,我可以获得值DueDateTypeID,但访问TypeID会抛出LazyInitializationException。 TypeID没有映射,因为我只想让它返回DueDateTypeID的值。

在我的映射中标记类lazy =“false”会消除问题。从我一直在阅读的内容来看,这是因为没有为非延迟映射类生成代理。

我想在这种情况下使用NHibernate的延迟加载功能;我是否需要实现IInterceptor或其他类似的东西,以便让NHibernate以不同的方式处理这个属性?

1 个答案:

答案 0 :(得分:3)

问题是实体的所有成员在访问时都会触发延迟初始化(除了id)。 NH无法知道您在会员中的实际行动。在会话外触发延迟初始化时,会出现错误。

建议:

  • 尽量避免对会话外的实体进行任何访问。关闭延迟加载时这是安全的 - 这通常不是一种方法。
  • 不要包装id。如果您访问TypeID,虽然没有必要,但实体已初始化,这对性能不利。