带有DTO的OData Web API Put请求
我有一个类似于这里的问题: 我有一个ODataWebAPI控制器,它有一个更新产品的put请求,但为了不公开我的数据库实体,我希望put方法接受ProductDTO。这可能吗 目前,我的ProductsController中有以下内容:带有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) {
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);