2011-06-28 38 views
2

我正在使用EF4和WCF數據服務。我想採用當前的SQL連接並使用此方法重新連接它,以便可以訪問各種客戶端(移動設備,Web,Win Client)的數據。我知道我可以使用LINQ,但我只是想知道如何使用存儲過程。存儲過程不適用於EF 4.0和WCF數據服務

這裏是我的示例存儲過程:

CREATE procedure getuserbyID (
@UserID int) 
AS 
SELECT Firstname, Lastname, Email From TestDatabase WHERE UserID = @UserID 

在我TestDataService.svc,我有在InitialService如下:

config.SetEntitySetAccessRule("Users", EntitySetRights.All); 
config.SetServiceOperationAccessRule("GetUserByID", ServiceOperationRights.All 

我又撥打了存儲過程的文件中,如下所示:

[WebGet] 
public List<User> GetUserByID(string UserID) 
{ 
    TestEntities entity = new TestEntities(); 
    return entity.GetUserByID(Convert.ToInt32(UserID)).ToList(); 
} 

在我的EF模型中,我導入了存儲過程作爲函數和s將其作爲GetUserByID並返回User實體。

當我測試了一下,我能夠通過使用瀏覽器中查看它來訪問實體: http://localhost:1753/TestWcfDataService.svchttp://localhost:1753/TestWcfDataService.svc/Usershttp://localhost:1753/TestWcfDataService.svc/Users(1) - 用1

一個UserID我知道它的工作與LINQ樣本用戶ODATA通過服務,但當我嘗試訪問存儲過程通過此:

- 然後我得到一個HTTP 500錯誤,該頁面無法顯示。我調試它,我查看錯誤和這裏是:

System.Data.EntityCommandExecutionException 是由用戶代碼消息未處理=該 數據讀取器是與指定的「Te​​stModel.User」的 不相容。 「用戶ID」類型的成員 在數據 閱讀器中沒有 對應列,名稱相同。

UserID是我在Users表中的主鍵和標識。任何幫助將不勝感激,並提前感謝您。

+0

只是猜測,但您的存儲過程返回看起來像User實體的列,但它們不包含關鍵屬性UserID。我認爲EF需要關鍵的財產價值才能實現實體。您是否嘗試將UserID作爲存儲過程中的一列返回? –

回答

0

我發現錯誤並遺憾浪費你的時間。我的一部分事故。由於UserID是我的主鍵,因此我沒有在我的選擇條件中使用它,因此數據閱讀器中沒有列。因此,回顧一下:確保您的存儲過程中的所有篩選條件也列在選擇條件中。只需將我的存儲過程更改爲(下)即可更正它。

CREATE procedure getuserbyID 
(@UserID int) 
AS 
SELECT UserID, Firstname, Lastname, Email From TestDatabase WHERE UserID = @UserID