2010-11-24 46 views
1

我是NHibernate的新手,但設法讓我的最新項目運行良好。但是現在我已經達到了不可避免的性能問題,我需要超越抽象來修復它。NHibernate延遲加載似乎不適用於我的域?

我創建了一個nunit測試來隔離需要很長時間的方法。但首先我的領域模型的快速概述可能是一個好主意:

我有一個'PmqccForm'這是一個對象,有一個'項目'對象,其中包含名稱,數量等,它也有'問題'對象,它是一個本身包含各種不同'問題'對象的屬性的類。有一個JobVelocityQuestion對象,它本身有一個答案和一些其他屬性,以及一大堆類似的Question對象。 這就是我與有我PmqccForm談論一個問題,反對 alt text

這是模式的問題部分: Question DOmain Model

關鍵的一點是,我希望能夠輸入 form.Questions.JobVelocityQuestion

因爲每個PmqccForm總是有一個JobVelocityQuestion,所有其他問題都是一樣的。這些是Questions對象的C#屬性,它只是它們的持有位置。現在

,就是造成我的問題的方法是這樣的:

 public IEnumerable<PmqccForm> GetPmqccFormsByUser(StaffMember staffMember) 
    { 
     ISession session = NHibernateSessionManager.Instance.GetSession(); 

     ICriteria criteria = session.CreateCriteria(typeof(PmqccForm)); 
     criteria.CreateAlias("Project", "Project"); 
     criteria.Add(Expression.Eq("Project.ProjectLeader", staffMember)); 
     criteria.Add(Expression.Eq("Project.IsArchived", false)); 
     return criteria.List<PmqccForm>(); 
    } 

從剛剛運行此方法NUnit測試我的控制檯一看顯示有被processsed近2000 sql查詢! http://rodhowarth.com/otherstorage/queries.txt是控制檯日誌。

事情是,在這個階段我只想要表單對象,實際的問題可以在需要知道的基礎上訪問。我認爲NHibernate是爲了能夠做到這一點?

這裏是我的映射文件: http://rodhowarth.com/otherstorage/hibernatemapping.txt

誰能暗示我一下,我缺少的是什麼嗎?或者一種方法來優化我在做關於NHibernate的工作?

如果我將問題提交給一個集合,然後通過此集合使屬性循環並返回正確的集合,該怎麼辦?從nhibernates的角度來看,這會是更好的優化嗎?

+0

可否請您更新室內用後你是如何調用上面的方法? – Baz1nga 2011-06-12 07:18:16

回答

0

只需嘗試將fetch =「subselect」添加到Questions組件的映射文件中,並查看這是否解決了對該表的多個選擇的問題 - 現在您應該看到一個第二個選擇而不是數百個單獨的查詢。

<component name="Questions" insert="true" update="true" class="PmqccDomain.DomainObjects.Questions" fetch="subselect"> 

參見更多信息 - Improving performance

+0

當我向該組件添加獲取屬性時,我得到「XML驗證錯誤:'fetch'屬性未聲明。「所以我嘗試將它添加到它下面的一對一映射,但它表示子選擇不是一個有效的值(連接等工作,但不改善任何東西) – RodH257 2010-11-24 23:00:43