【问题标题】:.net web api updating model on PUT.net web api 在 PUT 上更新模型
【发布时间】:2013-03-19 18:29:32
【问题描述】:

所以我正在尝试更新模型。以下是我的模型的设置方式:

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;}
}

现在我为事件 (EventViewModel) 创建了一个 ViewModel,因为每当我返回常规事件时,它都会在我身上抛出一个循环错误,我必须在我拉出的每个模型上的每个虚拟机上使用 [JsonIgnore]向上。此外,它还可以防止 web api 返回有关当前模型的过多信息。不需要的信息。

我的视图模型

public class EventVM {
    public string Name {get;set;}
    public DateTime Date {get;set;}
}

话虽如此,这就是我处理 PUT 的方式

[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 一起使用。帮助!想法?

【问题讨论】:

  • 您使用的是什么数据库? “icdb.SaveChanges()”我觉得应该是dbcontext.SaveChanges()吧?
  • 我的错,我刚改了。来自另一个项目。
  • 你调试了吗?我假设您正在使用实体框架。我认为你的代码对我来说看起来是正确的......只要确保你可以通过你传入的 id 检索事件
  • 是的,我可以获取带有 id 的实例。它似乎并没有与上下文相关联。
  • 问题是你的表单可能正在发帖,这已经在这里了,然后再看这里:stackoverflow.com/questions/8182620/… 作为旁注,你为什么不只是发布模型,或者使用tryupdatemodel 但使用 formcollection 形式而不是模型 TryUpdateModel(formcollection);

标签: .net asp.net-mvc-4 asp.net-web-api wcf-web-api


【解决方案1】:

我假设你知道你正在使用方法......所以

  1. 检查参数是否已绑定,否则您将永远无法通过第一次检查,并且您不会看到错误,因为不需要 mv 参数。好吧,您会在客户端看到错误的请求,但代码中什么也没有。

  2. 正如 ArdVark71 指出的,您的视图模型不包含 id

  3. 确保您的 dbContext 不为空

  4. 在您的尝试中upEvent.Name = eventVM.Name; upEvent.Date = eventVM.Date; eventVM 不存在

  5. 您的实体是否有您未填写的要求?喜欢组织者?

  6. 此外,日期和名称是错误的变量名称,我们的数据库人员会疯掉 =]

无论如何,如果这听起来太像代码审查,那么很抱歉,但是当出现代码问题时很难排除故障。还假设这些都只是拼写错误,您的 dbcontext 等仍然可能存在问题。因此,如果其他一切看起来都正确,请单步执行您的代码并查看 dbcontext,它是否在保存时隐藏了任何内容等?

祝你好运

【讨论】:

    【解决方案2】:

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

    尝试添加以下内容:

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

    dbcontext.SaveChanges();

    请参阅this question 了解更多信息。

    【讨论】:

    • upEvent 不包含 State 属性。
    • 好吧,也许试试 dbcontext.ObjectStateManager.ChangeObjectState(upEvent, EntityState.Modified)
    【解决方案3】:

    也许你的代码中的某个地方有?

    context.Configuration.AutoDetectChangesEnabled = false;
    

    修改事件后,如果上下文看到属性已修改,您也可以检查此项

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

    您也可以强制更新数据库(尽管我不会将此视为解决方案,而是将其视为解决方法,直到您诊断出问题为止)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2019-11-09
      • 2015-04-29
      相关资源
      最近更新 更多