我对此处有一个类似的问题:
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订阅源或条目阅读器指定实体类型时,它必须与指定实体集的基本类型相同或为子类型。
必须有办法做到这一点......任何想法?
干杯
答案 0 :(得分:0)
你需要
return Updated(product);
而不是
return Updated(DBProduct);
答案 1 :(得分:0)
结果不仅需要接受ProductDTO类型,还需要返回相同类型的ProductDTO。
我是通过在处理后将实体转换回DTO类型来实现的。通过这种方式,你可以做到谭俊福在答案中所说的话:
return Updated(product);
此product
可能是将DBproduct
转换回DTO类型的结果。