使用DTO问题的OData v4自定义路由

时间:2015-06-18 13:18:24

标签: c# entity-framework rest odata

我已经从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
            }));
    }

2 个答案:

答案 0 :(得分:0)

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

BTW,For Web API OData,

  

〔路线( “的OData / AMO_GeneralStateTypes({键})/ AMO_GeneralStates_Basic”)]

应该是

  

[ODataRoute( “的OData / AMO_GeneralStateTypes({键})/ AMO_GeneralStates_Basic”)]

答案 1 :(得分:0)

我在odto webapi中遇到过像dto这样的问题 这是我的解决方案:您需要为odata注册您的实体类型,否则将出现406错误

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

希望它有用