2014-02-18 88 views
0

我有一個事件模型:外鍵字段不會在Db.savechanges更新()

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

共享一個外鍵關係。 優先級表從P0到P9有10個固定優先級。

這是在視圖中編輯後的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()(其中有外鍵關係) 之後的優先級這是爲什麼?如果你有在Incident模型額外的外鍵屬性public int PriorityId { get; set; }

回答

1

你的程序會工作(或使用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。更改跟蹤將識別優先級是否發生更改,然後更新數據庫中的外鍵。