2014-02-17 78 views
2

我與實體框架代碼優先純粹的實現聚合根的掙扎。假設我們有一個Order和OrderItem的標準問題,後者是前者的孩子。我們需要有OrderItem的項目只讀集合中的Order類,所以我們可以(通過設計)控制添加,刪除或的OrderItems的更新在它的聚合根(即Order類)。聚合根和Entity Framework

  1. 我們如何實現這個OrderItem列表?這個列表需要是隻讀的,以便其他開發商不要試圖用手將OrderItem的(一個或多個)清單內,避免了應該使用的方法。

  2. 我們如何映射EF的Code First該集合?私有財產不可映射。

+0

可以映射私有成員:http://stackoverflow.com/a/13810766/861716 –

+0

這是真的,但幾乎沒有一個DDD的解決方案。您可以在域類和基礎持久性機制之間添加耦合。 –

+3

事實上,屬於實體框架環境的類模型首先是[數據層](http://stackoverflow.com/a/18113611/861716)。爲了便於數據訪問(虛擬成員,用於識別和外鍵的Id屬性,雙向關係,類似於數據庫表的類),必須優化所有內容。我的觀點是:你不能用EF類模型來執行DDD,ORM會有這麼一種或另一種方式的大腳印。 –

回答

1
  1. 我們如何實現OrderItem的(一個或多個)的這個名單?該列表需要是隻讀的,以便其他開發人員不要嘗試手動在列表中添加OrderItem,避免使用應該使用的方法。

只讀列表不會阻止其他開發者添加和刪除項目。它只會阻止它們更改OrderItems的引用指針。

你可以做的是榜上無名私有的,有一個方法的AddItem,和的removeItem上的updateItem秩序和列表迭代目的的IEnumerable吸氣。

  1. 我們如何在EF Code First中映射該集合?私有財產不可映射。

我從來沒有使用EF,但是從已經做過一些DDD,這是非常有用的一個,爲您的應用程序和邏輯,你的真實域模型實體,併爲您的數據的另一個實體集訪問框架,在這種情況下EF。並使用像AutoMapper這樣的東西來映射你的EF實體到你的域實體。

您不必總是有兩組實體,但對於像這樣的問題的實體,可以使EF實體想要的實體,只需添加從對象到對象的額外映射步驟即可。