Web API + OData - 可以为GET和POST使用不同的模型吗?

时间:2018-03-07 22:28:59

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

我正在使用Web API和Microsoft的OData实现来构建RESTful服务。对于给定的资源(此处为Employee),我想为GET请求返回一个表示(即,在检索集合或单个记录时),但接受POST的不同的表示, PUT / PATCH请求。

以这种方式构建我的API项目并尝试通过POST请求创建新的Employee之后,我将返回此异常:

{
    "error": {
        "code": "",
        "message": "The request is invalid.",
        "innererror": {
            "message": "employee : The entity type 'Api.DataContracts.Manage.EmployeeCreate' 
             is not compatible with the base type 'Api.DataContracts.View.Employee' 
             of the provided entity set 'MyProject.MyContainer.Employees'. When an entity 
             type is specified for an OData resource set or resource reader, it has to be 
             the same or a subtype of the base type of the specified entity set.\r\n",
            "type": "",
            "stacktrace": ""
        }
    }
}

为了进一步阐述我的场景,这里是我用来返回GET请求结果的模型:

namespace Api.DataContracts.View
{
    public class EmployeeView
    {
        public Guid Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string CompanyName { get; set; } // fetched from a related table
    }
}

到目前为止,这么好。但是当我想创建一个新的Employee时,我不想要一个Id字段(数据库会创建它)。我也不想接受CompanyName字段,因为我在创建时需要的是公司ID,因此我可以在数据库中正确设置关系。所以该模型看起来像:

namespace Api.DataContracts.Manage
{
    public class EmployeeCreate
    {    
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public Guid CompanyId { get; set; } 
    }
}

我的EmployeeController OData控制器上的相关签名是:

[HttpGet]
[ODataRoute("({key})")]
public IHttpActionResult GetEmployee([FromODataUri] Guid key)
// returns an Ok() with a EmployeeView model as the payload

[HttpPost]
[ODataRoute]
public IHttpActionResult AddEmployee(DataContracts.Manage.EmployeeCreate employee)

最后,我有这个EDM模型配置:

var builder = new ODataConventionModelBuilder();

builder.EntitySet<DataContracts.View.EmployeeView>("Employees");

// Had to add this to avoid a Media Formatter error
builder.AddEntityType(typeof(DataContracts.Manage.EmployeeCreate));

在我的研究中,无论是在SO还是在Web上,我都看到人们会问类似(但不完全相同)的问题。答案往往指出这种情况应该是可能的,但似乎使用微软的OData库可能会使这变得不可能。

我无法找到解决此问题的解决方案或解决方法。我已经考虑过将其中一个模型作为另一个模型的子类型(因为OData支持继承)但感觉它可能会引发一系列新问题。

有没有人成功使用过Web API + OData的类似架构?

0 个答案:

没有答案