Web API的部分更新无法正常工作
问题描述:
我在Web API中创建了一个post方法来对一个表进行部分更新 - 以更改表中的Order Status字段。这里是我到目前为止:Web API的部分更新无法正常工作
public IHttpActionResult UpdateOrderStatus(Order ord)
{
try
{
if (!ModelState.IsValid)
{
throw new ProcessException("One or more values are invalid, please check.");
}
using (MyContext ctx = new MyContext())
{
ord.StatusID = 3;
ctx.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord);
}
}
catch (Exception ex)
{
throw new ProcessException(ex.Message);
}
}
我通过代码,一切步进似乎是工作 - 没有错误,但数据库不会得到更新。我究竟做错了什么?
更新:
设置StatusID在对象将其传递到Web API方法之前:
变种的ord = { “订单ID” 1 “订购日期”:的currentdate, “StatusID” :3};
public IHttpActionResult UpdateOrderStatus(Order ord)
{
try
{
if (!ModelState.IsValid)
{
throw new ProcessException("One or more values are invalid, please check.");
}
using (MyContext ctx = new MyContext())
{
ctx.Entry(ord).State = EntityState.Modified;
ctx.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord);
}
}
catch (Exception ex)
{
throw new ProcessException(ex.Message);
}
}
答
如果你使用的EntityFramework,那么你需要通知上下文你正在更新订单对象。在EF6您通常有所谓Orders
的背景下DbSet
财产,所以,如果你设置StatusID
答
试试这个代码,我建议增加ctx.Orders.Attach(Order)
:用ord.OrderID比较 获取orderEntity从数据库,然后更新StatusID的记录。
using (MyContext ctx = new MyContext())
{
var orderEntity = ctx.Order.FirstOrDefault(x=> x.OrderID == ord.OrderID);
orderEntity.StatusID = 3;
ctx.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = ord.OrderID }, ord);
}
两两件事:'Order.StatusID = 3;'大概应该是'ord.StatusID = 3',你可能需要此之后:'ctx.Entry(ORD).STATE = EntityState.Modified;' –
这是使用实体框架?我怀疑问题在于你如何调用你的ORM。请标记您的ORM,或者如果手工制作,请包含MyContext的代码。如果直接调用方法会发生什么? – psaxton
如果您使用的是EntityFramework,那么您需要通知关于您正在更新的Order对象的上下文。在EF6中,您通常会在名为Orders的上下文中拥有'DbSet'属性,所以我建议在设置'StatusID'之前添加'ctx.Orders.Attach(Order)'。 – Rob