2010-04-06 180 views
15

我已經對錶結構進行了一些更改,尤其是SQL Server數據庫中表之間的關係。現在我想基於這個新的數據庫結構更新我的實體模型。如何在更改數據庫結構後正確更新實體模型?

右鍵單擊edmx文件我找到選項「從數據庫更新模型」。但是當我這樣做時,我得到了50%的更新:新列出現在實體類中,但我對模型中仍然存在的很多導航屬性感到困惑,儘管相應的外鍵關係不再存在數據庫。 (編輯:儘管數據庫中的列已被刪除,模型類中的成員也不會被刪除。)

我做錯了什麼?還是有另一種更新模型的選項,包括刪除導航屬性?或者是否必須在模型文件中手動刪除這些導航屬性?

我正在使用實體框架版本1(VS 2008 SP1)。

感謝您的幫助!

回答

16

你正在做正確的事情來更新。但是,在自動生成模型後,您可以對其進行自定義。當您更新時,EF設計師想要嘗試並保留您可能做出的任何自定義設置。它必須猜測這一點,但並不總是正確的。我會試着解釋它是如何猜測的,因爲這可能會幫助你。

你EDMX有三個部分:

  • 客戶端架構(CSDL)
  • 存儲模式(SSDL)
  • 客戶端和存儲之間的映射(MSL)

設計師「擁有「商店架構。每次更新時它都會從頭開始重新生成。儘管可以通過手動編輯SSDL來自定義商店模式,但是當您更新模型時,經常會丟失這些更改。

另一方面,您「擁有」客戶端模式。設計人員會在第一次運行時爲您生成客戶端模式,並且會爲新導入的數據庫元數據對象(例如新映射的表或列)生成客戶端模式。但是,一旦爲對象生成了客戶端模式,通常不會重新生成客戶端模式,因爲設計者正在嘗試保留您的自定義設置。因此,如果您以影響客戶端架構的方式更改數據庫,則必須手動更新客戶端架構。您可以在GUI設計器中執行此操作,也可以在XML中手動執行此操作。

就你而言,最簡單的做法可能是在GUI設計器中選擇導航並將其刪除。這是假定在關係的任何一方都不存在數據庫中導航的ID屬性。

+2

謝謝你的好解釋!我將手動刪除導航屬性和成員字段。而且萬一我搞砸了模型,我會刪除edmx文件並從頭開始重新創建模型(因爲我沒有在模型中進行任何定製)。 – Slauma 2010-04-06 13:07:06

3

如果您正在使用尚未定製的實體模型,並且您只需從SQL數據庫中將更改導入到VS項目中,我發現刪除實體模型並從同一來源重新生成它是最容易的。這樣,EDMX的所有三個部分都將反映數據庫中的內容。我之前使用過「從數據庫更新模型」選項,然後編輯了XML /設計器,發現在處理大型數據庫時這是繁瑣且耗時的工作。不要誤解我的意思,它可以100%地工作,但是通過重新創建模型可以讓你的模型保持新鮮。即使你以後需要編輯幾個LINQ到SQL的查詢,我發現編輯LINQ到SQL查詢比編輯EDMX模型更好。也就是說,我還沒有這樣做。重要提示:確保使用與以前相同的設置重新創建模型,例如,如果您之前未創建對象名稱而創建它,請執行相同的操作。

相關問題