1

我正在使用2個DB工作的應用程序。我想使用EF,Repository和UnitOfWork模式。我正在學習乾淨的代碼原則和設計模式,所以想要得到一些反饋,因爲雖然我(認爲)理解了主要想法,但我在實現中遇到了一些困難。我收集了很多答案和文章,但仍然無法完全將這些想法帶入我的具體問題。實體框架,存儲庫模式和2個數據庫

我有2個DB。

  1. 我們的ERP系統的遺留數據庫。只讀訪問(又名ERP-DB)。從這個數據庫我必須採取我需要的所有信息。
  2. Project-DB。需要創建,對此我沒有任何限制。 (又名項目-DB

因此,首先,如果我的理解是正確的ERP-DB我應該使用DBFirst的方法,因爲我不能修改數據庫和項目數據庫,我可以用任何人,作爲CodeFirst也許是最好的方法(因爲我試圖做DDD),所以我可以先設計我的領域模型,然後定義將持續的東西。

現在的1個問題:

  • 的ERP-DB是很 「一般」,有例如一表 「的文章」。在這裏你可以找到任何類型的文章,從完整的構建設備到裝配件。 因此,對於DBFirst,EF爲其生成一個名爲「Articles」的實體。但我不想在我的領域模型中使用這樣的類,我想要更好的類如transmitter,termometer,measureCell等。它們是「特定」的文章。所以我需要將Articles映射到不同的域對象。

    • 我需要手動做還是EF可以在DBFirst中爲我做?
    • 如果手動,我應該爲每個域對象創建一個Repository並將地圖邏輯放入其中?或者我應該創建2個存儲庫,1個用於數據實體,1個用於域對象,然後創建地圖邏輯的位置?
    • 某些特定物品包含多個article,即transmitter具有measureCell,兩個實體都在相同的articles表中。所以在這裏,我的TransmitterRepository有一個方法,知道如何檢索一個發射器,或者我應該把這個邏輯放在哪裏?現在

,關於該項目-DB,我可以用CodeFirst專注於我的域模型,並確定需要保留什麼。所以,如果我選擇這種方法並理解它,我可以直接將我的數據實體映射到我的域對象。但是我不完全理解它,因爲對於我來說,我只是將相同的邏輯放在其他地方,而不是在回購中使用它,而是直接在我的對象中使用它,但是我在那裏「贏」了什麼?

+0

您可以[先對現有數據庫進行編碼](https://msdn.microsoft.com/en-us/library/jj200620(v = vs.113).aspx)。我不明白你最後的問題。 EF簡單地說就是已經實現了工作單元模式的對象關係映射器。關於是否使用存儲庫,首先編寫代碼和首先編寫數據庫等進行了大量的討論和討論。 –

回答

1

對於您的ERP-DB,您仍然可以對現有數據庫使用Code first方法,但是您需要帶上自己的映射配置,在其中更改目標表,列等的名稱。在article表的情況下,合適的解決方案似乎是基於TPH方法你hiearchy模型:

http://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy

所以對你來說意味着創建抽象基類article然後derrived類transmitter等,然後通過流暢的API創建映射。當然,你的article表中必須有一個合適的鑑別器列。

所以這裏應該是我的TransmitterRepository有一個方法,知道如何檢索發射器或我應該把這個邏輯放在哪裏?

是的,這是一個標準情況。您的存儲庫有一些FindById方法。

但是我在那裏「贏」了什麼?

這意味着您的代碼會更少,因爲您將不再有任何數據實體並映射到存儲庫中的它們之間的域實體。