2010-06-07 96 views
1

我有一個情況,我有3個表格:StockItem,Office和StockItemPrice。每個Office的每個StockItem的價格可能不同。從Nhibernate加入結果中填充域對象的未映射屬性

StockItem(
    ID 
    Name 
) 

Office(
    ID 
    Name 
) 

StockItemPrice(
    ID 
    StockItemID 
    OfficeID 
    Price 
) 

我已經建立了一個有2個多對一關係的模式來連接StockItem和Office。所以在我的StockItem域對象我有一個屬性:

IList<StockItemPrice> Prices; 

它被加載與該項目的價格爲每間辦公室。這工作正常。現在我正在試圖爲一個辦公室購買一件物品的價格。我有以下條件查詢:

NHibernateSession.CreateCriteria(persistentType) 
       .Add(Restrictions.Eq("ID", id)) 
       .CreateAlias("Prices", "StockItemPrice") 
       .Add(Restrictions.Eq("StockItemPrice.Office", office)) 
       .UniqueResult<StockItem>(); 

這似乎工作正常,因爲它生成的SQL是我所期望的。但是,我不知道它是否正確填充StockItem.Prices,因爲只要我引用屬性NHibernate執行所有辦公室價格的延遲加載。而且,即使它的工作,那感覺真是這些混沌具有通過使用訪問價:

mystockitem.Prices[0].Price 

我真的想是有StockItem對象上Price場,並有項目賣出期權的價格通過NHibernate進入該領域。

我已經嘗試添加.CreateCriteria("Price", "StockItemPrice.Price")與CreateAlias相同,但我得到的錯誤

NHibernate.QueryException : could not resolve property: Price of: StockItem 

這是有道理的我猜的價格是不是對應的屬性。

我將如何調整查詢以使其成爲可能?

回答

1

如果你願意從StockItemPrice刪除ID,你可以更好地利用地圖處理這個問題。

聲明你的價格屬性,如下所示:

IDictionary<Office, decimal> Prices { get; set; } 

和MAP這樣說:

<map name="Prices" lazy="extra"> 
    <key column="StockItemID" /> 
    <map-key-many-to-many class="Office" column="OfficeId"/> 
    <element type="Decimal" column="Price"/> 
</map> 

要特別注意lazy="extra"屬性。這意味着,當你這樣做:

decimal priceInNY = item.Prices[nyOffice]; 

只爲nyOffice價格(一個Office實例或代理)將從數據庫中檢索。

0

如果你有Prices屬性中所有辦公室的價格,爲什麼要回到數據庫?

public virtual StockItemPrice GetPriceForOffice(Office office) 
{ 
    return Prices 
     .Where(p => o.Office.Equals(office)) 
     .SingleOrDefault(); 
} 
+0

通常我只需要一次顯示單個辦公室的數據(其在線訂購平臺辦事處可以從中獲得庫存)。我猜如果NHibernate將數據保存在緩存中,那就不會太糟糕。但我不想爲所有辦公室收回所有價格數據,然後每次頁面加載時重複獲取我想要的價格。 – 2010-06-07 11:32:03