我有一个事件模型:
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()
(具有外键关系)之后的优先级没有反映出这些变化
这是为什么?
答案 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
。更改跟踪将识别优先级是否确实更改,然后更新数据库中的外键。