2013-10-31 54 views
3

我偶然發現了StackOverflow和Google等網站,但無法理解如何實現它的概念。The Infamous Entity Framework - Aggregate Root Issue

這裏我有一個非常非常簡單的模型:一個Item和一個ItemActivity。很明顯,Item是聚合根,而ItemActivity是一個實體。

因此,根據DDD原則,我應該只實施ItemRepository。除了它自己的-let說 - CRUD操作ItemRepository也應該管理它的子實體,ItemActivity's,也是CRUD操作。

這裏來了一些執行問題:

  1. 我應該在域或 庫實現子實體操作。
  2. 加載與項目相關的所有子實體或導航到它們 與Entity Framework一致。加載根.include(..)將 做的工作。但是更新ItemActivity甚至 刪除ItemActivity?從集合中刪除它們不會保留 。
  3. 假設我必須在一段時間內找到所有活動。 如何實現這樣的查詢,而我無法通過 ItemActivity查詢或更糟糕的是根本不存在任何 ItemActivityRepository
  4. 是否有涵蓋此主題的示例。有很多關於它的文章 ,很多答案沒有具體的代碼和理論 覆蓋範圍,但請,有沒有真實樣本。我曾在 微軟西班牙N層DDD示例,但它不夠詳細。

此致敬禮。

+1

不要錯誤地將聚合根視爲兒童對象的容器。在定義任何Domain對象時,忘記與持久性相關的任何事情。這包括忘記關係數據庫原則。 – MikeSW

回答

3

1.我是否應該在域或存儲庫中實現子實體操作。

編號存儲庫僅處理聚集。

2.使用實體框架載入與項目相關的所有子實體或導航到它們。使用.include(..)加載根將執行該工作。但是如何更新ItemActivity或甚至刪除ItemActivity?將它們從集合中刪除不會持續。

Item.getActivity().updateRemark("..."); 
    ItemRepository.store(Item); 

3.Assume,我必須找一個時間跨度內的所有活動。

如果您需要按範圍查詢它們,最好使ItemActivity成爲另一個聚合根。較小的聚合體有助於這種情況。

4.Is there a sample covering this topic. 

着名的Effective Aggregate Design。有一些示例代碼(尤其是第1部分)與您的案例密切相關。

+0

更新很簡單,但如何刪除?從集合中移除項目只會刪除關係,但會留下孤立項目 –

+0

@LiviuM。我不熟悉實體框架,但我認爲刪除取決於您如何定義映射。在JPA/Hibernate中,如果子集被映射爲組件,則在從集合中刪除時將被刪除。 – Hippoom

+0

在EF直到6.1。不是這種情況。 –