我正在使用EF4和WCF数据服务。我想使用我当前的SQL连接并使用此方法重新连接它,以便我可以从各种客户端(移动,Web,Win客户端)访问数据。我知道我可以使用LINQ,但我只是想知道如何使用存储过程。
这是我的样本存储过程:
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模型中,我已将存储过程作为函数导入并保存为GetUserByID
,并返回User
实体。
当我测试它时,我可以通过使用以下方式在浏览器中查看实体来访问实体:
http://localhost:1753/TestWcfDataService.svc
或http://localhost:1753/TestWcfDataService.svc/Users
或http://localhost:1753/TestWcfDataService.svc/Users(1)
- UserID
为1的样本用户
我知道它通过服务使用LINQ和ODATA但是当我尝试通过这个访问存储过程时:
http://localhost:1753/TestWcfDataService.svc/GetUserByID?UserID='1'
- 然后我收到HTTP 500错误,无法显示该页面。我调试它,我查看错误,这里是:
System.Data.EntityCommandExecutionException 没有被用户代码Message = The处理 数据阅读器与...不兼容 指定'TestModel.User'。成员 类型''UserID',没有 数据中的相应列 读者同名。
UserID
是Users
表中的主键和标识。任何帮助将不胜感激,并提前感谢您。
答案 0 :(得分:0)
我发现错误并抱歉浪费你的时间。我的一个不幸事件。因为UserID是我的主键,所以我没有在我的选择标准中使用它,因此数据阅读器中没有列。因此,回顾一下:确保所有过滤条件也列在存储过程的选择条件中。只需将我的存储过程更改为(下方)更正它。
CREATE procedure getuserbyID
(@UserID int)
AS
SELECT UserID, Firstname, Lastname, Email From TestDatabase WHERE UserID = @UserID