外键字段不会在Db.savechanges()上更新

时间:2014-02-18 15:33:21

标签: entity-framework asp.net-mvc-4

我有一个事件模型:

public class Incident
{
    public int Id { get; set; }
    public string Description { get; set; }
    public virtual Priority Priority { get; set; }
    public DateTime? ResolvedAt { get; set; }
}

和优先级模型:

public class Priority
{
    public int Id { get; set; }
    public string Description { get; set; }
}

共享外键关系。 优先级表有10个固定优先级,从P0到P9。

这是在View中编辑后的HttpPost。

    [HttpPost]
    public ActionResult Edit(Incident incident)
    {
        if (ModelState.IsValid)
        {
            if (incident.Id == 0)
                db.Incidents.Add(incident);
            else
            {
                db.Incidents.Attach(incident);
                db.Entry(incident).State = EntityState.Modified;
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(incident);
    }

调试时我可以看到incident内的所有更新。 但是savechanges()(具有外键关系)之后的优先级没有反映出这些变化 这是为什么?

1 个答案:

答案 0 :(得分:1)

如果public int PriorityId { get; set; }模型中有额外的外键属性Incident(或者int?是可选的,请使用Incident.Priority),您的程序将有效。然后,您会将Incident.PriorityId绑定到您的视图(组合框?),而不是Incident.Priority.Id

如果您不想要外键属性并坚持使用您的模型,那么编辑操作将会更加复杂,如下所示:

[HttpPost]
public ActionResult Edit(Incident incident)
{
    if (ModelState.IsValid)
    {
        db.Priorities.Attach(incident.Priority);
        if (incident.Id == 0)
            db.Incidents.Add(incident);
        else
        {
            var incidentInDb = db.Incidents.Include(i => i.Priority)
                .SingleOrDefault(i => i.Id == incident.Id);
            if (incidentInDb != null)
            {
                db.Entry(incidentInDb).CurrentValues.SetValues(incident);
                incidentInDb.Priority = incident.Priority;
            }
        }
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(incident);
}

通常在实体上设置Modified状态不会为关系设置此状态(除非模型中有外键属性,请参阅第一段)。这就是原始代码不起作用的原因,并且需要额外的行incidentInDb.Priority = incident.Priority。更改跟踪将识别优先级是否确实更改,然后更新数据库中的外键。