我有一個要求加載一個複雜對象調用節點 ...好它不是那麼複雜......它看起來像如下: -預先加載使用功能NHibernate/NHibernate的與自動映射
一個節點具有的EntityType具有一對多與屬性其又具有一對多與PorpertyListValue
0的參考public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new List<Property>();
}
}
public class Property
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType EntityType
{
get;
set;
}
public virtual IList<PropertyListValue> ListValues
{
get;
protected set;
}
public virtual string DefaultValue
{
get;
set;
}
public Property()
{
ListValues = new List<PropertyListValue>();
}
}
public class PropertyListValue
{
public virtual int Id
{
get;
set;
}
public virtual Property Property
{
get;
set;
}
public virtual string Value
{
get;
set;
}
protected PropertyListValue()
{
}
}
我試圖做的是一次加載所有子對象的節點對象。沒有延遲加載。原因是我有數以千計的數據庫中的節點對象,我必須通過使用WCF服務的線路發送它們。我遇到了類SQL N + 1問題。我將Fluent Nhibernate與Automapping結合使用,並且NHibernate Profiler建議我使用FetchMode.Eager一次加載整個對象。我現在用的是以下qyuery
Session.CreateCriteria(typeof (Node))
.SetFetchMode("Etype", FetchMode.Join)
.SetFetchMode("Etype.Properties", FetchMode.Join)
.SetFetchMode("Etype.Properties.ListValues", FetchMode.Join)
或當我運行任何上述查詢使用NHibernate LINQ
Session.Linq<NodeType>()
.Expand("Etype")
.Expand("Etype.Properties")
.Expand("Etype.Properties.ListValues")
,他們都產生了所有的左外同一個單一查詢聯接,這是什麼我需要。但是,由於某種原因,返回的IList從查詢中沒有被加載到對象中。事實上,返回的節點計數等於查詢的行數,因此節點對象會重複。而且,每個節點中的屬性都會重複,Listvalues也會重複。
所以我想知道如何修改上面的查詢來返回其中的屬性和列表值的所有唯一節點。
感謝 納比爾
在谷歌我發現了DistinctRootEntityResultTransformer但 只解決了Root對象的問題。我仍然在子集合中獲得 重複項。 返回列表中的每個根對象在具有同一實體的多個實例的子集 集合中都有一些奇怪的笛卡兒積。任何想法? 等待 Nabeel – nabeelfarid 2010-06-30 11:39:05
我想我找到了解決方案,但我想知道它的 是否正確。 根對象(Node)內的子集合(EType.Properties,Etype.Properties.ListValues) 是IList。我在文檔 中看到IList可以包含重複項,所以如果我將IList更改爲ISet/ ICollection,那麼查詢不會在子集合中加載 中的重複實例。 但是這個解決方案需要大量的重構。我想知道 如果有一種方法可以使用IList爲兒童 集合實現相同效果嗎? 等待, Nabeel – nabeelfarid 2010-06-30 15:31:20
我有同樣的問題(使用Fetchmode.Eager)。我在NHibernate中對此非常失望。我寧願有一個錯誤比錯誤的數據。 – UpTheCreek 2011-01-17 14:00:18