2011-09-28 164 views
0

我是看着「NHibernate的3新手指南」的書,發現有趣的提示:一對多映射。 NHibernate的

在現實生活中的庫存應用程序,你可能會想避免 穿上類別實體產品集合,因爲它是 可能某個類別可能有數百個(如果不是成千上萬個) 關聯產品。爲了加載整個,給定類別的大量產品 將是不明智的,並且會導致應用程序 具有不滿意的響應時間。

提示是正確的一對多關係建立的例子。這些實體是ProductCategory。這個例子很簡單:

public class Category : Entity // Entity probably contains an `Id` property 
{ 
    private List<Products> products; 

    public String CategoryName { get; set; } 
    public String Description { get; set; } 
    public IEnumerable<Product> Products { get { return products; } } 
} 

public class Product : Entity 
{ 
    public Decimal UnitPrice { get; set; } 
    public String ProductName { get; set; } 
    public Category Category { get; set; } 
} 

那麼什麼是一對多關係的真實生活的例子?

Category作爲String屬性放在產品實體中的示例就足夠了嗎?

回答

1

想法是,如果您避免將IList屬性合併在一起,您仍然可以獲得某個類別的產品,例如像下面這樣:

var products = session.QueryOver<Product>().Where(p => p.Category == someCategory).List(); 

可是你現在要做的分頁,篩選的可能性,得到的頂級產品等:

var product = session.QueryOver<Product>().Where(p => p.Category == someCategory).OrderBy(p => p.Relevance).Take(1).SingleOrDefault(); 

它,如果它是一個簡單的IList的屬性,你沒有。總的來說(根據我的經驗),你所擁有的雙向協作越少,查詢粒度就越好。而且,它在節省時降低了複雜性。

-1

我想報價會說你不應該在Category類中使用Products屬性。

+0

有很多理由來維護一對多的財產。例如:如果我有訂單,我可以選擇在該訂單實體上擁有一個Items集合。由於訂單項在訂單的上下文之外絕對沒有意義,因此我甚至可能選擇不具有OrderItemRepository。 – Boris

1

您可能希望看看Nhibernate的懶惰屬性。它允許您不要總是加載該屬性,除非我們明確要求它。

Nhibernate Lazy

0

讓我們問不同的問題:如果你的應用程序應該呈現類別樹視圖控制,這在擴展類節點將列出所有的產品?當您想要顯示所有產品時,除了...實際查詢數據庫並加載所有產品之外別無他法。

這實際上是相當常見的現實生活場景,最簡單的方法之一就是簡單地擁有Category.Products屬性。當然,擁有這樣的屬性並沒有錯,但真正的問題是你應該如何管理這些對象。

幸運的是,您不必將所有產品拉入單個類別拉。 Category.Products可以標記爲負載延遲(而不是熱切,更多信息可以找到here)。這意味着,加載類別將不會查詢數據庫中的產品。相反,NHibernate將爲Products創建proxy對象,它可以稍後進行初始化 - 當它們實際需要時(請考慮用戶擴展類別節點)。


並回答你的問題......

如果單品,勢必只有一個類別,然後這是很好的現實生活中的一個一對多關係的例子。但是,如果產品可以被多個類別描述,那麼它就是多對多的關係