【问题标题】:OData v4 custom route using DTO problemsOData v4 自定义路由使用 DTO 问题
【发布时间】:2017-12-27 10:24:55
【问题描述】:

我已经从 EF 6 模型设置了 OData v4 控制器。使用生成的代码时一切正常。

对于将在下拉列表中引用的某些对象,我想限制发送的数据,因此 DTO 似乎是最好的方法。所以我现在有了一个控制器,可以正常处理普通对象,但是一旦我在自定义路由上使用 DTO,我就会遇到麻烦。

我使用了下面的代码,它正确地生成了 DTO 集合,但是当它返回数据时,我最终在客户端上出现 406 Not Acceptable 状态。

关于哪里出了问题有什么建议吗?

作为旁注,我想要提供一个完整的和一个缩小的对象的策略是最好的方法吗(就标准而言)?

    // GET: odata/AMO_GeneralStateTypes(5)/AMO_GeneralStates_Basic
    [EnableQuery]
    [Route("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]
    public IQueryable<AMO_GeneralStatesDTO> GetAMO_GeneralStates_Basic([FromODataUri] int key)
    {
        return db.AMO_GeneralStateTypes
            .Where(m => m.StateTypeId == key)
            .SelectMany(m => m.AMO_GeneralStates.Select(n => new AMO_GeneralStatesDTO()
            {
                StateId = n.StateId,
                StateGuid = n.StateGuid,
                ParentStateId = n.ParentStateId,
                State = n.State,
                TypeId = n.TypeId,
                SortOrder = n.SortOrder,
                Enabled = n.Enabled
            }));
    }

【问题讨论】:

    标签: c# entity-framework rest odata


    【解决方案1】:

    对于 406 Not Acceptable,请确保在 finally Edm 模型中定义了返回类型。即AMO_GeneralStatesDTO是Edm模型可以序列化的类型。

    顺便说一句,对于 Web API OData,

    [Route("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]

    应该是

    [ODataRoute("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]

    【讨论】:

    • 谢谢山姆。这帮助我解决了一个问题 - 我曾认为脚手架使用的是 Odata v4,但实际上是 V3,V4 的脚手架似乎处于非常早期的状态,所以我认为我现在只使用 Odata 3 .
    • 哎呀 - 我的意思是添加这个问题,添加这个 builder.EntitySet("AMO_GeneralStatesDTO");对模型似乎没有帮助。这是这样做的方式还是我误解了。谢谢@sam-xu
    【解决方案2】:

    我在 odata webapi for dto 中遇到了一些类似的问题 这是我的解决方案:您需要为 odata 注册实体类型,否则会出现 406 错误

        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntityType<YourDTOType>();
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      相关资源
      最近更新 更多