2009-10-22 95 views
0

比方說,我有一個名爲Blog的類有一個稱爲BlogEntries(包含BlogEntry類型的對象)的屬性的域模型。如果我有一個包含兩個表格「Blog」和「BlogEntry」的數據庫模型,那麼我有1000個博客條目並不是不可能的。如果我要在網站上顯示博客,我一次只想顯示20個博客條目,所以我將不得不使用某種分頁。我顯然不希望1000條記錄始終從數據庫中提取。在NHibernate中尋呼

我該怎麼做呢? BlogEntries屬性是否應該位於Blog域對象中,或者可能位於存儲庫中?我仍然希望有可能添加博客條目以及創建現有博客條目的分頁結果。 NHibernate映射是什麼樣的?

Blog/BlogEntry只是一個例子,它可能也是一個Customer/Order示例或任何其他主/細節場景。

請賜教!

回答

1

我會使BlogEntry它自己的聚合根,與它自己的存儲庫。通過查詢具有給定BlogID的所有BlogEntry的BlogEntry存儲庫,您可以獲得特定Blog的BlogEntry實例。由於實現存儲庫有多種不同的策略(一個通用存儲庫與許多獨立的查找程序方法,另一個需要複雜的規範對象等),所以我無法提供有關存儲庫的詳細信息。存儲庫的查找器方法應該支持分頁。

public class Blog 
{ 
    public int ID {get;set;} 
    // other stuff 
} 

public class BlogEntry 
{ 
    public int ID {get;set;} 
    public int BlogID {get;set;} 
} 

public class BlogEntryRepository 
{ 
    public IEnumerable<BlogEntry> FindByBlogID(
     int blogID, int pageIndex, int pageSize) 
    { 
     // implementation 
    } 
} 

另外,(也用BlogEntry建模爲集合根),您可以將BlogEntryID集合添加到您的Blog類中。這比在Blog類中使用BlogEntry實例本身更好,因爲當您想要獲取Blog實例時,要加載的數據要少得多。使用這些ID,您可以選擇它們的子集並將它們傳遞到接受ID集合的BlogEntry存儲庫方法中。換句話說,在您的域中會有更多邏輯支持分頁,並且會在存儲庫中使用更通用的getter。

public class Blog 
{ 
    public int ID {get;set;} 
    public IEnumerable<int> BlogEntryIDs {get;set;} 
    // other stuff 
} 

public class BlogEntry 
{ 
    public int ID {get;set;} 
    public int BlogID {get;set;} 
} 

public class BlogEntryRepository 
{ 
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    { 
     // implementation 
    } 
} 

使用這種方法會像

// get the second page 
var entries = 
    blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE); 

在數據庫中,你會返回多行,每個博客條目。 (我也傾向於返回多個結果集以獲取來自一個數據庫中所有相關表的所有行的往返行程,還利用SQL 2005的ROW_VERSION函數啓用數據庫分頁)。典型的使用情況顯示與博客相關聯的(例如多於幾千)BlogEntry實例數量過多。一堆太多的int會讓我對性能和內存保持警惕。

+0

我喜歡你的答案,這是很有道理的。 「除非」部分怎麼樣 - 如果數組很大,你會怎麼做。從性能記憶的角度來看,當你在20歲以後從另一臺機器上的數據庫中讀取一千條記錄似乎是一個糟糕的主意(如你所寫)。 – Kristoffer 2009-10-23 05:56:11

+0

在「除非」的情況下,我會採用第一種方法。我添加了示例代碼以使兩種方法更清晰。在第二種方法中,使用BlogEntryID集合,即使您可能要求數百或數千行,但您只需要每行有一個整數列。要確定這是否可以接受,唯一的方法是在某個級別建立性能要求並進行一些初步測試。或者只是採用第一種方法。 – 2009-10-23 06:33:41

-1

對於收集博客條目,您可以使用BatchSize屬性。它會讓你不要從數據庫中選擇所有的集合,只需要所需的值。

+0

這將仍然加載頁面1的所有值,當瀏覽到頁面2 – Paco 2009-10-22 15:00:46

1

您必須訪問它自己的存儲庫中的blogentry才能獲得分頁列表。

編輯:爲什麼downvote?這是錯的嗎?