2011-10-06 56 views
3

我使用NHibernate和我有3映射類 - A,B,C類看起來如下:NHibernate的:投影和引用類型的屬性

public class A 
{ 
public virtual string StringProp1 { get; set; } 
public virtual string StringProp2 { get; set; } 
public virtual B BProp { get; set; } 
public virtual C CProp { get; set; } 
} 

一切工作正常,但我想做的是一些優化。我的目的是有可能動態指定哪些屬性應該加載(從數據庫)。所以我不能將一些屬性標記爲映射中的懶惰。我認爲它應該工作方式如下:

ICriteria criteria = session.CreateCriteria<A>(); 
criteria.SetProjection(Projections.ProjectionList() 
.Add(Projections.Property("StringProp1"), "StringProp1") 
.Add(Projections.Property("BProp"), "BProp")); 
criteria.SetResultTransformer(Transformers.AliasToBean<A>()); 
return criteria.List<A>(); 

但是,這並不爲引用類型屬性(如BProp)工作,即使我加入了一個別名的標準。我在最後一行得到'索引超出數組範圍'異常。

如果我刪除添加了BProp的投影的行,這將工作並返回一個只有StrinProp1填充值的類的實例。但我想要將相應的B類實例加載到BProp中。

有什麼建議嗎?

回答

0

聽起來不像正確的做事方式。如果你想急於負荷BProp,你應該做的是這樣的:

criteria.SetFetchMode("BProp", SetFetchMode.Eager); 
+0

我想加載BProp和StringProp1性質,但不cprop可與StringProp2(爲了使結果的SQL語句簡單,更快)。我不認爲FetchMode是我正在尋找的。 – mayor