【问题标题】:OData V4 property accessOData V4 属性访问
【发布时间】:2016-05-16 15:46:03
【问题描述】:

我使用 Visual Studio 2015 Web API 2 项目和脚手架控制器(“Microsoft OData V4 Web API Controller Using Entity Framework”脚手架)创建了一个非常原始的 OData Web 服务。

我的模型中只有一个实体集:“书籍”。 “Book”实体有一个私有的“Title”字符串属性。

我假设脚手架控制器将服务于所有合法的 OData v4 请求,但情况似乎并非如此?

http://localhost:xxxx/OData/Books 有效(枚举具有所有属性的所有书籍 - 包括“标题”属性)

http://localhost:xxxx/OData/Books(1) 有效(枚举第一本书的所有属性,包括“Title”属性)

http://localhost:xxxx/OData/Books(1)/Title 不起作用 - 我得到一个“没有找到路由约定来为带有模板 '~/entityset/key/property 的 OData 路径选择一个操作” strong> 错误,尽管请求是 100% OData v4 投诉?

为什么它不起作用?它不应该工作吗?需要什么才能让它发挥作用?

【问题讨论】:

    标签: c# odata asp.net-web-api2 scaffolding


    【解决方案1】:

    脚手架创建一个控制器来处理所有合法的 OData v4 请求。

    要检索 Book 实体的 Title 属性,您必须向 BooksController 添加一个方法,如下所示:

    public string GetTitleFromBook([FromODataUri] int key) 
    {
        // Put appropriate method logic here.
    }
    

    请参阅Routing Conventions in ASP.NET Web API 2 Odata 中的“查询导航属性”和“属性”表。

    此外,请考虑使用$select query option 来限制您在响应对实体的正常请求时获得的属性。例如:

    GET http://localhost:xxxx/OData/Books(1)?$select=Title
    

    【讨论】:

    • 非常感谢您提供的链接 - 现在我想我明白了。是否正确地说,为了处理对实体的任何单个属性的请求,该实体的控制器必须实现一个单独的专用操作方法,形式为“GetFrom(...)" 为每个可用的属性?
    • 可以,只要您使用实体属性的内置路由约定。作为替代方案,您可以编写自己的路由约定,支持将属性名称作为字符串传递给您的控制器方法,但这需要更多的工作。
    • 如果您希望使用它们,一个选项是使用 T4 模板生成这些标准属性和导航访问链接。这是非常通用的代码,在某些应用程序中很有用,但只有当你编写它时,一旦你有超过 5 或 6 个表,就会变成大量的手写管道代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2017-05-25
    • 2015-03-06
    相关资源
    最近更新 更多