OData Web API使用DTO提出请求

时间:2014-04-25 12:19:48

标签: odata asp.net-web-api

我对此处有一个类似的问题:

OData update controller throwing 415 Unsupported media type error

我有一个OData Web API控制器,它有一个更新产品的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");

产品在哪里:

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }
    public DateTime Timestamp { get; set; }
}

和ProductDTO:

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订阅源或条目阅读器指定实体类型时,它必须与指定实体集的基本类型相同或为子类型。

必须有办法做到这一点......任何想法?

干杯

2 个答案:

答案 0 :(得分:0)

你需要

return Updated(product); 

而不是

return Updated(DBProduct);

答案 1 :(得分:0)

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

我是通过在处理后将实体转换回DTO类型来实现的。通过这种方式,你可以做到谭俊福在答案中所说的话:

return Updated(product);

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