2011-09-15 66 views
0

我有一个这样的接口:NHibernate的返回ID会话之外,而不是通过属性

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的值。

在我的映射中标记class lazy =“false”会清除问题。从我读过的内容来看,这是因为没有为非惰性映射类生成代理。

我想在这种情况下使用NHibernate的延迟加载功能;我需要实现IInterceptor还是一些这样的,为了让NHibernate以不同的方式处理这个属性?

回答

3

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

建议:

  • 尽量避免会话外实体的任何访问。只有在关闭延迟加载时才是安全的 - 这通常不是一种方法。
  • 不要包装id。如果您访问TypeID,则实体将被初始化,但不是必需的,这对性能不利。
相关问题