如何在更改數據庫結構後正確更新實體模型?

entity-framework entity-model

我在表結構中做了一些更改,尤其是SQL Server數據庫中表之間的關係。現在我想基於這個新的數據庫結構更新我的實體模型。

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

難道我做錯了什麼?或者是否有其他選項來更新模型,包括刪除導航屬性?或者我是否必須在模型文件中手動刪除這些導航屬性?

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

提前感謝您的幫助!

一般承認的答案

你正在做正確的更新。但是,在自動生成模型後,您可以自定義它。更新時,EF設計人員希望嘗試保留您可能進行的任何自定義。它必須猜測這一點,並不總是正確的。我會嘗試解釋它是如何猜測的,因為這可能會幫助你。

您的EDMX有三個部分:

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

設計者“擁有”商店架構。每次更新時,它都會從頭開始重新生成。雖然可以通過手動編輯SSDL來自定義存儲架構,但在更新模型時經常會丟失這些更改。

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

在您的情況下,最簡單的方法可能是只選擇GUI設計器中的導航並將其刪除。這假設在關係的任一側不再存在數據庫中導航的ID屬性。


熱門答案

如果您正在使用尚未自定義的實體模型,並且只需要將SQL數據庫中的更改添加到VS項目中,我發現刪除實體模型並從同一源重新生成它是最簡單的。這樣,EDMX的所有三個部分都將反映數據庫中的內容。我之前使用過“從數據庫更新模型”選項,然後編輯了XML /設計器,發現在處理大型數據庫時,這是一項繁瑣而耗時的工作。不要誤解我的意思,它可以100%運行,但通過重新創建它可以讓你的模型保持新鮮感。即使您之後必須編輯一些LINQ-to-SQL查詢,我發現編輯LINQ-to-SQL查詢比編輯EDMX模型更好。那就是說,我還沒有那麼做。重要信息:確保使用與以前相同的設置重新創建模型,例如,如果您在創建它之前沒有復制對象名稱,請執行相同操作。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因