1

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

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

现在我为事件创建了一个 ViewModel (EventViewModel),因为每当我返回常规事件时,它都会在我身上抛出一个循环错误,我必须在我拉起的每个模型上的每个虚拟机上使用 [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 一起使用。帮助!想法?

4

3 回答 3

0

也许在您的代码中的某个地方?

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

于 2013-04-06T20:13:22.437 回答
0

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

尝试添加以下内容:

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

dbcontext.SaveChanges();

有关更多信息,请参阅此问题

于 2013-04-06T19:54:03.300 回答
0

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

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

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

  3. 确保您的 dbContext 不为空

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

  5. 您的实体是否有您未填写的要求?喜欢主办方?

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

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

祝你好运

于 2013-04-06T19:26:36.247 回答