带有DTO的OData Web API Put请求

带有DTO的OData Web API Put请求,odata,asp.net-web-api,Odata,Asp.net Web Api,我有一个类似于这里的问题: 我有一个ODataWebAPI控制器,它有一个更新产品的put请求,但为了不公开我的数据库实体,我希望put方法接受ProductDTO。这可能吗 目前,我的ProductsController中有以下内容: public IHttpActionResult Put([FromODataUri] int key, ProductDTO product) { if (!ModelState.IsValid) {

我有一个类似于这里的问题:

我有一个ODataWebAPI控制器,它有一个更新产品的put请求,但为了不公开我的数据库实体,我希望put方法接受ProductDTO。这可能吗

目前,我的ProductsController中有以下内容:

    public IHttpActionResult Put([FromODataUri] int key, ProductDTO product)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (key != product.ID)
        {
            return BadRequest();
        }

        Product DBProduct = AsProduct(product);

        db.Entry(DBProduct).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!ProductExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(DBProduct);
    }
这是我的WebApiConfig.cs文件:

        builder.EntitySet<Product>("Products");
        builder.EntitySet<ProductDTO>("ProductDTO");
和产品D:

public class ProductDTO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }
}
但我得到了以下信息:

实体类型“ProductService.DTOs.ProductDTO”与提供的实体集“Container.Products”的基类型“ProductService.Models.Product”不兼容。为OData提要或条目读取器指定实体类型时,该实体类型必须与指定实体集的基本类型相同或是其子类型

一定有办法做到这一点…有什么想法吗

干杯

你需要

return Updated(product); 
而不是

return Updated(DBProduct);

结果不仅需要接受ProductDTO类型,还需要返回相同类型的ProductDTO

我通过在处理实体后将其转换回DTO类型来实现这一点。这样你就可以像谭俊夫在回答中说的那样:

return Updated(product);

product
可能是将
DBproduct
转换回DTO类型的结果。

将我的WebApiConfig更改为builder.EntitySet(“产品”);builder.EntitySet(“ProductsDB”);解决了put的问题,但它不会影响我的单一获取方法[Queryable]公共SingleResult GetProduct([FromODataUri]int key)
return Updated(product);