2015-04-12 20 views
1

我想用Web API項目中的實體框架實現替換我現有的數據庫訪問層。我已經有一些包含所需邏輯和屬性的域類,例如Airport1,但實體框架生成了重複的對象,例如Airport2。我需要將Airport1合併到由EF創建的Airport2對象嗎?或者只是將我的Airport1類更改爲部分類?如何結合類和實體框架模型

+0

所以,我的理解是,您的數據模式有Airport2類,您也有一個名爲Airport1的自定義類具有相同的屬性。 Airport1被你的控制器層(web api)使用。我對嗎? – Vim

+0

您只能在EF應用程序中使用一種類型的模型,爲什麼不讓EF從已定義的模型生成數據庫? –

+0

使用分部類。 – Jonesopolis

回答

0

EF的一個強大功能,有時是缺陷,就是它的目的是保持數據庫/模型關係的一半與另一個同步,所以你不必這樣做。有兩個基本的模型,數據庫優先和代碼優先。在數據庫中,EF首先檢查預先存在的數據庫模式並生成匹配其引用的域模型。在代碼優先的情況下,EF檢查您的域並生成生成和更新數據庫模式的「遷移」。

你似乎想要做的是結合這些方法;爲大多數對象生成一個類,但是使用您自己定義的「Airport」對象覆蓋生成的模型。不幸的是,沒有一種方便的方式可以做到這一點,這是我們的工作保障。

的選項有:

  • 放棄現有的模型,並生成使用「數據庫優先」範式一個新的。您將失去現有域中的任何自定義業務邏輯,這在維護基本數據庫完整性方面並不固有;這個邏輯將不得不被移動到不同的層,比如你的控制器/表示層。

  • 放棄您現有的數據庫並使用Code First Migrations根據默認約定生成一個新數據庫。您必須使用SSIS,SSMS數據導入工具或手動插入選擇語句來將舊數據庫中的數據導入新數據庫。

  • 使用自定義實體類型配置映射和映射約定將現有模型映射到Code First範式中的現有數據庫。您將失去很多EF爲您處理此樣板文件的權力,但可以保留您現有的域模型,並實際控制域模型轉換爲數據層的方式。

  • 編輯數據庫優先範式的映射模板文件以在生成的類中包含自定義業務邏輯。這個解決方案非常迅速地變得非常笨拙,但是它會爲POCO領域類中的一些必須添加的工作做好工作。

  • 編輯數據庫優先映射模板以生成部分域類,它將與包含自定義業務邏輯的開發人員編碼的部分聲明配對。允許在域中包含業務邏輯功能,但模板中沒有大量的內容,但它有其自身的限制;例如,您只能通過這種方式添加函數和非映射屬性,您無法創建將映射到數據庫的自定義屬性(雖然您可以創建自定義屬性來「包裝」映射的屬性,但這會創建一個非常令人困惑的模型依靠編碼器約定來確定從使用代碼中使用哪個屬性)。