2011-02-14 67 views
51

我正在使用.NET 3.5 SP1,VS 2008與實體框架。我最初添加了一個存儲過程到我的模型,其中有2個參數。後來,我改變了sproc只需要一個參數。我運行了Update Model From Database菜單選項並確認我的sproc列在Refresh選項卡中。完成嚮導,清理並重建解決方案,並且模型永遠不會更改sproc的簽名。刷新實體框架中的存儲過程3.5

爲什麼不更新?數據庫功能的更新模型是否被破壞?我錯過了什麼嗎?謝謝。

+1

我認爲它的概率EF1.0 :( – anishMarokey 2011-02-14 17:34:20

+1

嘗試刪除並重新添加 – 2011-02-14 17:34:48

+0

我怎麼知道哪個版本的EF我正在運行?是否有更新版本的EF可用於3.5? – Jeff 2011-02-14 18:03:46

回答

128

我將它添加到實體框架後看到了兩個問題,更新存儲過程:

  • 創建調用存儲過程的函數導入未更新(不正確的,外的日期參數)
  • 的存儲過程的結果集創建複雜類型未更新(不正確的,超出日期字段)

更新EDMX模型(函數導入)

  1. 打開.edmx文件(在GUI設計器中)。
  2. 右鍵單擊某些空白處並選擇「從數據庫更新模型」。
  3. 在彈出窗口中單擊完成(如果可以)。您的SPROC簽名應該更新(以及任何功能導入)。

更新存儲過程的複雜類型

  1. 打開 「模型瀏覽器」 窗口,當你擁有的.edmx開放。

  2. 展開ContentModelEntityContainer相關:...,然後函數導入節點。爲你的存儲過程尋找功能導入並且雙擊吧。您用於創建它的同一個窗口將打開,但現在已填充其數據。

  3. 單擊獲取列信息按鈕(查看按鈕下方的網格以查看將要更改的內容)。

  4. 單擊「複雜」單選按鈕選項旁邊的更新按鈕。

  5. 點擊確定,並且結果集的複雜類型應該更新。

0

您必須刪除並添加存儲過程,因爲實體框架需要爲您的過程生成新的定義。我想你需要重做功能導入。

基本上,如果你改變了程序的邏輯,而不是返回類型或簽名,你不需要再次添加它。它可以很好地工作,但是如果你改變返回類型或簽名ef需要生成並將它映射到一個新的定義,那就是它的工作方式。

+0

我試過這個,它沒有工作由於「更新模型...」功能從未實際上將模型與數據庫同步,因此在過時的存儲過程中執行功能導入只是重新創建了舊簽名。 – Jeff 2011-02-14 18:02:25

+0

因此,您基本上永遠無法從模型中刪除該過程並添加模型與新的更新過程? – Vishal 2011-02-14 18:20:23

1

它花了很多手動編輯XML和Visual Studio的重啓,但我終於能夠讓VS忘記以前的簽名。然後,我只是使用普通的EF嚮導將其添加回來,它工作得很好。

1

如果更改存儲過程的簽名,則需要通過函數導入來更新在模型中創建的任何複雜類型。

0

曾在EF4一個類似的問題在沒有選項刷新個人SPS,它的意思去做,當你點擊刷新更新嚮導,但它並不可靠地工作。我不得不在模型瀏覽器中刪除返回值的複雜類型,以及函數import。然後用XML編輯器進入edmx文件並刪除對存儲過程的引用(無法在模型瀏覽器中找到這種方法)。然後重新添加sps。

6

如果您需要更改數據類型列在結果 - >在STOR PROC的開頭添加 設定FMTONLY關

然後使用 模型瀏覽器 - >功能導入 - - >編輯您的PROC - >獲取列信息按鈕 - >更新按鈕

這是尼爾是怎麼做的:)

0

您也可以刪除SP的所有證據在以下場所,論文文件可以在打開時在模型瀏覽器中找到.edmx文件:

  • YourModel>複雜類型;
  • YourModel>功能導入;
  • YourModel.Store>存儲過程/函數。

刪除後,您可以添加它沒有問題。

13

您不必編輯edmx/xml。這樣做:

當您將存儲過程加入EDMX(我正在討論返回結果集的過程,但它將是一個類似的過程),3,而不是1,創建項目,並且是問題的根源。 (***問題的第二個來源是,在重新導入對象之前,必須在刪除對象之後顯式保存,否則新重新導入的對象將與edmx中未真正刪除(通過保存)的內容發生衝突。

所以做這個:

在模型瀏覽器,通常在左邊,粘貼您的存儲過程的名稱在搜索框中,點擊進入(或搜索),這將降落在初審 - 可能!存儲過程本身,右鍵單擊並刪除,現在將光標放回到搜索框 - >點擊進入或重新搜索,現在你將登陸導入的函數,右鍵單擊並刪除,第三次做同樣的事情 - 這會在表示結果集的複雜類型上着陸,刪除它,現在你完成不了!!!!!,你必須sa你剛剛做了什麼,以便刪除在edmx中寫入(未寫入)。

現在,再次獲取存儲過程(更新模型/選擇存儲的過程)。現在再次點擊保存。

這會每次都有效。關鍵是確保在使用模型瀏覽器搜索出現在模型瀏覽器中的存儲過程名稱的所有實例時,最好不要在默認的命名約定中大驚小怪。第二個關鍵是在完成任何步驟後保存。