2013-02-10 127 views
3

我正在構建我的應用程序,其中包括存儲庫模式,聚合根和工作單元。我正在使用Entity Framework5作爲ORM。存儲庫模式和聚合根模式以及實體框架

我處於這種情況,我不知道如何繼續添加聚合根,並且與不是聚合根的實體有外鍵關係的新實體。

我不確定我是否理解了我以前的陳述,但讓我在這裏舉一個例子。

人表在DB(這是一個總的根在我的應用程序)

  1. 名稱
  2. 地址行1
  3. CountryID

國表(這不是因爲我可能永遠不需要獨立查詢它們)

  1. CountryID
  2. 國家名稱

在我的應用我有PersonsRepository它實現了一個通用的存儲庫,其中T是一個聚合根。

現在,當我在我的代碼中創建一個新人時,我需要將Country添加到Person對象的導航屬性中。如果我創建一個新的Country對象並將其分配給Person的Country屬性並嘗試保存Person對象,則EF將引發錯誤。我無法查詢Countries表,因爲它不是我的Aggregate根。

嗯,這不是我的實際情況,但這是我想要克服的。我應該如何從這裏出發?

我想到的一個想法是創建一個通用的只讀存儲庫,它將用於查詢數據庫而不是修改數據庫,是繼續執行還是出現錯誤。

在此先感謝您的回覆和閱讀長篇文章。

+0

什麼錯誤EF拋出? – 2013-02-10 20:24:36

+0

它引發「無法投人Person對象鍵入國家」,我認爲這是完全有效的,爲什麼我應該創建一個新的國家對象時,它是一個外鍵在DB中。它工作得很好如果我使用datacontext獲取Country,並在創建它時將其分配給Person對象。 – 2013-02-10 23:45:47

回答

5

聚合根不僅僅是你可能不需要直接查詢的東西。根據你的推理,你將不得不多次創建同一個國家,因爲你無法查詢該國是否退出(即該國是一個需要Person存在的薄弱國家)。

簡單地說,agreggate根就是可以被識別而沒有其他任何東西的對象。一個國家可能沒有一個人而存在,而一個命令行在沒有命令的情況下不能被識別。你可能想看看這篇文章:http://dddcommunity.org/library/vernon_2011

至於實體框架,請查看我實現庫/ UOW的:http://blog.gauffin.org/2013/01/repository-pattern-done-right/

+0

感謝您的回覆jgauffin,這清除了我對聚合體的理解。 – 2013-02-12 14:08:25

+1

存儲庫文章:*'一個更現實的方法是,您在UserRepository.GetUsersGroupOnSomeComplexQuery()中直接使用ADO.NET,而您在UserRepository.Create()中使用實體框架。'*爲什麼我沒有考慮過,歡呼! – 2017-05-05 07:19:39