2011-09-15 67 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,則實體將被初始化,但不是必需的,這對性能不利。
相關問題