2011-04-29 43 views
1

我已經從SQL Server 2005數據庫生成實體框架模型並開始導入存儲過程。到目前爲止這麼好,但是其中一個存儲過程拋出一個異常,當我嘗試運行它時:存儲過程參數名稱和實體框架

過程或函數'csp_getCoworker'需要參數'@@ firstname',它沒有提供。

這裏是存儲過程的簽名:

ALTER PROCEDURE [dbo].[csp_getCoworker](
@@firstname nvarchar(32), 
@@lastname nvarchar(32), 
@@businessarea nvarchar(512), 
@@location nvarchar(512) 
) 

,這裏是由實體框架生成的代碼

ObjectParameter p_firstnameParameter; 
if (p_firstname != null) 
{ 
    p_firstnameParameter = new ObjectParameter("p_firstname", p_firstname); 
} 
    else 
{ 
    p_firstnameParameter = new ObjectParameter("p_firstname", typeof(global::System.String)); 
} 
[...] 
return base.ExecuteFunction<csp_getCoworker_Result2>("csp_getCoworker", p_firstnameParameter, p_lastnameParameter, p_businessareaParameter, p_locationParameter); 

是它在參數名稱的雙重@ -characters多數民衆贊成搞亂東西了嗎?

回答

2

我剛剛測試過這個,因爲它是非常罕見的情況。

存儲過程遵循非常奇怪的命名約定,因爲@@不應該被使用。它由一些SQL服務器系統變量默認使用,不應該用於其他任何事情。使用@x作爲存儲過程的參數定義參數x,但使用@@x將定義參數@x - @是參數名稱的一部分!

這是C#中的一個非常大的問題,因爲@是用於定義與保留關鍵字相同的變量名稱的轉義字符。例如:

string @string = "abc"; 

定義變量命名string。變量名稱不能以@開頭。

實體框架通過將所有@替換爲_並將參數的名稱前綴替換爲直接在SSDL中的p來解決此問題。原因是從SSDL映射存儲過程創建的函數導入必須具有與過程相同名稱的參數,但在同一時間@不允許開始字符。如果您嘗試手動修改EDMX,則它將失敗其自己的XSD驗證,因爲@不允許在CSDL中定義標識符的起始字符。

即使這大概可以看作是瞭解缺失可能改變CSDL參數的名稱的錯誤。目前,這是設計的,唯一的方法是糾正SQL存儲過程中參數的名稱。

+0

這是一個很好的答案!它給了我在正確的方向一推,我寫的包裝程序,正確命名變量剛剛過去他們到相應的SP解決了這個問題。 – 2011-05-04 09:34:40

+2

@Bartek:你應該* *做的是找到誰決定這是一個好主意,在它們的參數名稱使用雙@ -marks,耳光他們,然後讓他們解決這個問題。 – 2011-09-05 19:16:47

+0

@Matti:我試過了,但他們已經長期以來離開組織。 > :( – 2011-09-08 09:52:27