2016-07-07 80 views
2

我們正在重寫現有的內部ASP.NET Web窗體應用程序。我們的應用程序由Web Api後端組成,後端使用Entity Framework 6進行數據訪問,前端使用AngularJS。使用現有數據庫時熟悉實體框架

我們有一個現有的大型數據庫,我使用Code-First Using Existing Database方法創建了EF模型,我們將數據傳輸對象類用作API方法的輸入/輸出,所以我們不直接暴露我們的模型類。所以基本上,我試圖在EF,Web Api和AngularJS的同時熟練掌握。大多數情況下,我對後兩者相當舒服,但對於EF我還沒有完全適應。我曾在微軟虛擬學院觀看過很多視頻,但這是我第一次有這方面的實際經驗。

我們一直在研究這個應用程序幾個月,到目前爲止我們只需要在我們的實體(POCO DTO's)上使用簡單屬性的平面對象進行CRUD操作。然而,我們終於遇到了一些情況,我們不僅要處理我們的類,而且要處理類本身的屬性;一個親子關係。

因此,我有以下問題:

  1. 我看到,當我們在我們的DB正確的外鍵關係,即虛擬財產在EF,其中從我記得是支持創建延遲加載。但是,在我們使用Web服務(Web Api)的環境中,延遲加載並不是真的可行。我們的對象模型確實允許一些非常大的類的層次結構,其中一個完全填充的對象及其子元素將意味着大量的數據將被傳遞,但實際上並不是必需的,所以在大多數情況下,第一級對象就是我們所有的需要。但是在某些情況下,我們確實想要填充子類,所以我的問題是我們如何做到這一點,以及我們在哪裏做到這一點?我查看了DB上下文中自動生成的代碼,但我們也使用腳手架代碼來創建我們的控制器。我們需要做哪些事情?我看過代碼示例,顯示瞭如何做到這一點,但沒有具體說明代碼的位置。它似乎在一個控制器內,但我可能是錯的。

  2. 如果我們允許2級或更多級別的對象層次,EF是否自動處理操作(更新,刪除等) - 例如,如果我們有一個「公司」對象具有「客戶」對象,我們刪除「公司」對象,相關的「客戶」對象也會被刪除嗎?另外,像是在事務中自動執行的多步操作,還是我們需要明確設置?

  3. 如果我修改模型類或數據庫上下文,看到這段代碼是自動生成的,這通常是不好的做法,因爲我的更改可能會被覆蓋,所以我假設控制器代碼是我想讓我的變化。我知道數據庫遷移,但我沒有與他們的經驗,我相信我需要在某個時候使用它們,因爲我相信我們的數據庫可能沒有EF所需的所有外鍵關係,目前需要。

我知道這是一個很長的帖子,但如果任何人都可以就如何做一些事情一定的指導意義,因爲它不是唯一的我來說,這不得不應付這一點,但我有兩個其他開發商在我的球隊誰正在從事這個項目,我們都和其他人一樣缺乏經驗。由於

回答

0
  1. 對於跨Web服務發送數據的目的,我建議建立一個DTO抱着你要發送的數據和映射,而不是試圖發送實體本身在實體到DTO你的有效載荷它還可以保護您的API免受您實體的變更。

  2. 級聯刪除是可配置的,iirc,但我不是100%確定默認是什麼。事務通常不是隱含的,因此您需要使用那些您需要的事務。

  3. 不完全確定你在這裏問什麼。一般來說,你的實體/表如何改變取決於你使用的是數據庫優先還是代碼優先。如果您首先使用的是數據庫(您的解決方案中將有一個.edmx文件,其模型與您的模式相匹配),那麼您只需直接更新SQL並通過.edmx更新實體模型。如果您先使用代碼,則會更改實體的方式,並運行數據庫遷移來更新數據庫以進行匹配。

MSDN文章有關代碼第一次遷移:https://msdn.microsoft.com/en-us/data/jj591621.aspx

+0

我們已經做了#1。這也讓我們可以靈活地轉換數據,但是現在它基本上是模型類的一個克隆(具有更適當的屬性名稱)。至於#3,沒有edmx文件。我通過添加一個新的ADO數據模型並從數據庫中選擇Code First來創建模型類。我不記得爲什麼我們選擇不使用數據庫中的EF模型(我認爲我們的老闆推薦了數據庫中的Code First)。 – DesertFoxAZ