2013-07-11 78 views
5

我一直在搞亂這一切上午,但我無法找到答案。我試圖用EF引用一個存儲過程,但無論我怎麼努力,我不能讓它在模型瀏覽器中顯示。實體框架將不會顯示存儲過程

我已經使用以下步驟來嘗試讓程序進入模式:

  1. 插件程序,實體模型

  2. 右鍵單擊模型,選擇Add New - >功能導入

  3. 給它一個名稱,然後選擇我的程序

  4. 生成一個新的複雜的集合(我也曾嘗試使用實體,無論是工作)

  5. 單擊確定

我已經這樣做了很多次,我可以看到在模型中的「功能導入」文件夾的功能,但它從來沒有出現在模型中,所以我不能參考它。

我發現我可以通過以下操作直接引用存儲過程(不包括進口):

DBEntities db = new DBEntities(); 
    var test = db.gsp_GetGroups(); 

但是,我不能這樣沒有大的解決方法轉換爲IQueryable<T>

是否有人知道什麼步驟我失蹤得到這個適當加?

謝謝

P.S. VS 2012,asp.net 4.0

+0

我有同樣的問題,你有沒有想過問題是什麼? – Michiel

+0

對於我的項目,我最終沒有使用EF來存儲特效,但我確實記得與另一個開發人員討論了這個問題,並且我記得他說這是proc沒有與之關聯的任何模型的問題。我會盡力狩獵他並問他。 – Limey

+0

FWIW,存儲的proc結果無法通過服務器端的IQueryable進一步擴展。如果您希望將其他查詢功能傳遞給數據集,則可能需要使用表值函數導入。 –

回答

1

@Limey您的問題可能是由您的導入功能Access級別引起的。試試這個:

Model Browser找到該文件夾​​Function Inports。現在右鍵單擊您的功能並選擇Properties。在屬性窗口的第一個選項應該是Access改變它Public並保存model.edmx。

回到你的代碼,看看這項工作。

+0

對不起,但那不是。訪問權限已被設置爲公開。 – Limey

7

驗證SQL登錄您使用生成您的EF模型有權限執行您要導入存儲的特效。

  1. 轉到您的App.config並查找connectionStrings條目(通常位於底部)。如果你有超過1個連接字符串,你想要的就是你的上下文使用的那個。
    • 轉到您的edmx文件並深入查找實體類。
    • 例如,如果您有MyDbModel.edmx,那麼您將擁有MyDbModel.Context.tt,而這又將包含MyDbModel.Context.cs
    • MyDbModel.Context.cs文件,你將有來自DbContext繼承的類和構造函數會調用base("name=<your connection string name>")
    • <your connection string name>是你在你的app.config尋找一個。
  2. 你的連接字符串顯示用戶(集成安全性將意味着,在記錄的AD用戶。這如果大家誰使用你的程序將有正確的DB訪問只會工作,這可以在一個危險的假設生產環境)
  3. 轉到SQL Management Studio中,該存儲過程添加到用戶的「安全對象」
+0

這解決了我的問題。 – pixelmeow

+0

正如我在Mark的回答中評論的那樣,如果你能幫到的話,不要給每個人都執行權限。通過將數據庫限制爲特定的登錄名來保證數據庫的安全;在這種情況下,您分配給EF模型的人。 – David

+0

這工作!謝謝 –

1

這可能是因爲實體框架是簽署該數據庫不具有權限的用戶ID執行存儲過程。

要了解:

在你的app.config或web.config文件在你的.NET項目,請檢查其user id正在訪問數據庫。你會在user id=之後connectionString之後看到它。

如果它不同於您用來編寫存儲過程的用戶標識(例如在SQL中),請與您的數據庫管理員聯繫,以查看.NET中的用戶標識(以及實體框架)是否有權限執行存儲過程。

+0

ID可以完全訪問數據庫。 – Limey

1

我有一個類似的問題,從實體框架5升級到6爲我解決問題。

對我來說,它並沒有在存儲過程下顯示我的自定義sql服務器模式,儘管它在表格部分正確顯示了相同的模式。

希望這可以幫助別人。

6

轉到Sql Server Management Studio中的SP,右鍵單擊屬性,轉到權限將public設置爲Execute。

以上都可能是答案,它是一個權限問題,上面的答案讓我看看爲什麼,並得出結論。

+1

注意這一點 - 授予執行公共可能是一個安全漏洞。最好只對其需要訪問的SP授予特定的登錄權限,並將其留在那裏。 – David

+1

呼叫良好+1。儘管這指向了權限問題。 –

+1

好的地方,請確保您授予EXECUTE到正確的用戶/組和存儲過程。在我的情況下,我從另一個sp複製了EXECUTE權限,並沒有改變它 – kolin