我使用EF6针对SQL Azure数据库在VB.Net中编写了一个带有OData的Web API 2 - 而且一切都运行良好 . 现在我需要添加另一个控制器,该控制器使用传递ID的存储过程返回一组记录 . 我正在使用EF 6的Database First选项,因此我在SQL中创建了Stored Proc并导入到我的EF模型中 . 返回的数据与任何现有实体都不匹配,因此它返回EF更新工具创建的复杂类型 .

我使用VS 2013脚手架创建了OData控制器,其中只有一个Get动作接受ID并返回存储过程的记录集 . 我还将控制器名称添加到ODataConventionModelBuilder以设置路由 . 当我尝试调用Controller(ID)时,它返回此错误 .

{
"odata.error": {
    "code": "",
    "message": {
        "lang": "en-US",
        "value": "No HTTP resource was found that matches the request URI 'http://localhost:54146/odata/UnMappedIOTags1(441)'."
    },
    "innererror": {
        "message": "No routing convention was found to select an action for the OData path with template '~/entityset/key'.",
        "type": "",
        "stacktrace": ""
    }
}

}

我的WebApiConfig.vb包含以下内容:

Dim builder As New ODataConventionModelBuilder
    '...  12 other entries removed for brevity
    builder.EntitySet(Of IO)("IOs")
    builder.EntitySet(Of mapUnMappedTags_Result)("UnMappedIOTags1")

    config.Routes.MapODataServiceRoute(
                routeName:="odata",
                routePrefix:="odata",
                model:=builder.GetEdmModel(),
                batchHandler:=New DefaultODataBatchHandler(GlobalConfiguration.DefaultServer))

我的控制器看起来像这样 .

Public Class UnMappedIOTags1Controller
    Inherits ODataController
    Private db As New AppasEntities

    <ResponseType(GetType(mapUnMappedTags_Result))> <EnableQuery>
    Function GetUnMappedIOTags1(<FromODataUri> key As Integer) As IQueryable(Of mapUnMappedTags_Result)

        Return db.mapUnMappedTags(key).AsQueryable

    End Function
End Class

我让它在不使用OData路由的Web API控制器中工作,但我更喜欢像项目中的其他14个OData控制器一样实现OData控制器 .

我错过了什么?