.net web api在发布时更新模型

.net web api在发布时更新模型,.net,asp.net-mvc-4,asp.net-web-api,wcf-web-api,.net,Asp.net Mvc 4,Asp.net Web Api,Wcf Web Api,所以我正在尝试更新一个模型。以下是如何设置我的模型: public class Event{ public int Id {get;set;} public string Name {get;set;} public DateTime Date {get;set;} public int Organizerid {get;set;} public virtual User Organizer {get;set;} } public class Organizer{ p

所以我正在尝试更新一个模型。以下是如何设置我的模型:

public class Event{
  public int Id {get;set;}
  public string Name {get;set;}
  public DateTime Date {get;set;}
  public int Organizerid {get;set;}

  public virtual User Organizer {get;set;}
}

public class Organizer{
  public int Id {get;set;}
  public string Name {get;set;}

  pubilc virtual iCollection<Event> Events {get;set;}
}
说到这里,我就是这样处理我的推杆的

[HttpPut]
        public HttpResponseMessage Put(int eventId, EventVM event)
        {
            if (ModelState.IsValid && eventId== event.Id)
            {

                try
                {
                    Event upEvent = dbcontext.Event.FirstOrDefault(e => e.Id == eventId);
                    upEvent.Name = eventVM.Name;
                    upEvent.Date = eventVM.Date;

                    dbcontext.SaveChanges();
                    return Request.CreateResponse(HttpStatusCode.OK);
                }catch(Exception ex){
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest);
            }
        }

我的问题是它没有保存更新。我想做一个TryUpdateModel,但它似乎不能与WebApi一起使用。救命啊!想法?

我假设你知道你正在使用这个方法。。。所以

  • 检查参数是否已绑定,如果未绑定,您将无法通过第一次检查,并且不会看到错误,因为不需要mv参数。您将在客户端上看到一个错误的请求,但代码中没有任何内容

  • 正如ArdVark71指出的,视图模型不包含id

  • 确保dbContext不为null

  • 在您的try
    upEvent.Name=eventVM.Name;
    upEvent.Date=eventVM.DateeventVM不存在

  • 您的实体是否有未填充的需求?像组织者

  • 此外,Date和Name都是不好的变量名,我们的db人员会使用nutz=]
  • 无论如何,如果这听起来太像代码审查,那就很抱歉了,但是当出现代码问题时,很难排除故障。另外,假设这些都是打字错误,那么dbcontext等仍然可能会有问题。因此,如果其他一切看起来都是正确的,请仔细检查代码并查看dbcontext,它是否会在保存时隐藏任何内容,等等


    祝您好运

    假设您使用的是实体框架,并且您的示例与实际代码相比可能有点不完整。。这可能是分离实体的问题

    尝试添加以下内容:

    upEvent.State = EntityState.Modified);
    dbcontext.SaveChanges();
    
    dbcontext.SaveChanges()


    有关更多信息,请参阅

    也许你的代码中有什么地方

    context.Configuration.AutoDetectChangesEnabled = false;
    
    修改事件后,若上下文认为属性已修改,也可以检查此项

    var nameIsModified = dbcontext.Entry(upEvent).Property(u => u.Name).IsModified;
    

    您也可以强制更新到数据库(虽然我不认为这是解决方案,但它是解决问题的方法,直到您诊断出问题)


    将属性标记为已修改会强制在调用SaveChanges时将更新发送到该属性的数据库,即使该属性的当前值与其原始值相同-

    您正在使用哪个数据库?“icdb.SaveChanges()”我想应该是dbcontext.SaveChanges(),对吗?我的错,我刚刚更改了它。来自另一个项目。你把它放进去了吗?我假设您使用的是实体框架。我认为你的代码在我看来是正确的。。。请确保您可以通过传入的id检索事件是的,我可以获取id为的实例。它似乎没有连接到上下文。问题是您的表单可能正在发布帖子,这在这里已经出现过。请看这里:作为旁注,您为什么不发布模型,或者使用tryupdatemodel,但使用formcollection表单而不是模型tryupdatemodel(formcollection);upEvent不包含状态属性。好的,可以尝试dbcontext.ObjectStateManager.ChangeObjectState(upEvent,EntityState.Modified)
    var nameIsModified = dbcontext.Entry(upEvent).Property(u => u.Name).IsModified;
    
    dbcontext.Entry(upEvent).Property(u => u.Name).IsModified = true;