2011-07-10 90 views
1

我有點尷尬。ASP.NET MVC:嘗試保存對集合的更改時發生UpdateModel失敗 - 創建新對象而不是更新

基本上,我試圖創建一個對象的集合--EF對象的準確編輯。 我將視圖傳遞給包含Call類型對象的視圖模型。這是一個EF類型。一個電話有很多答案。在視圖我遍歷所有的答案和輸出的形式:

@using (Html.BeginForm()) 
    { 

     foreach(var a in Model.Answers) 
     { 
      Html.RenderPartial("_AnswerForm", a); 

     } 
     <input type="submit" value="Save Answers" /> 
    } 

局部視圖如下:

@using (Html.BeginCollectionItem("Answers")) 
{ 
    <div data-role="fieldcontain"> 
     @Html.HiddenFor(z => z.QuestionID) 
     @Html.HiddenFor(z => z.CallID) 
     @Html.LabelFor(x => x.OnEntryAnswer) 
     @Html.CheckBoxFor(x => x.OnEntryAnswer) 
     @Html.ValidationMessageFor(x => x.OnEntryAnswer) 

     @Html.LabelFor(x => x.OnExitValue) 
     @Html.TextBoxFor(x => x.OnExitValue) 
     @Html.ValidationMessageFor(x => x.OnExitValue) 

     @Html.HiddenFor(x => x.id) 
    </div> 
} 

我的控制器動作看起來像....

[HttpPost] 
     public ActionResult FacingsAdjacency(FormCollection data) 
     { 
      Call activeCall = null; 

      try { activeCall = this.GetCallInformation(); } 
      catch (NoActiveCallException ex) { TempData["message"] = "No Call In Progress!"; RedirectToAction("NoCallInProgress"); } 
      QuestionFormViewModel vm = new QuestionFormViewModel(activeCall, "FacingsAdjacency"); 


      UpdateModel(activeCall.CallAnswers, "Answers"); 
      callRepository.Save(); 


      return View(vm); 
     } 

當調用Save(調用savechanged在上下文中)時拋出錯誤:

的關係無法改變,因爲一個或多個外鍵的屬性 的是不可爲空

如果我檢查的datacontext是跟蹤我看到的項目有兩倍多應該有。有三個要修改(正確),三個具有完全相同的細節,標記爲已添加。所有的數據都通過POST來填充EF對象 - 我只是不確定它爲什麼失敗。

感謝

回答

1

我發現,管理對象的引用,並將其保存到數據庫中,當EF可以是一個有點疼痛。

我建議你在調用callRepository.Save()以除去引用的對象(只需將屬性設置爲null)之前'清理'答案,只保留ID字段。

+0

有趣。愚蠢的問題,但我怎麼才能'獲得'的UpdateModel可以做它的業務之前的答案? – Sergio

+0

在UpdateModel之後,而不是之前。然後你可以遍歷activeCall.Answers。 –

0

在更新方法存儲庫嘗試

_dbSet.Attach(entity); 
_dbContext.Entry(entity).State = System.Data.EntityState.Modified; 
_dbContext.SaveChanges(); 
1

嗯,這很奇怪。如果有人能解釋這一點,我很樂意聽到它!

基本上我通過從我的答案表中刪除自動遞增主鍵並使用組合鍵來解決問題。 靈感來自這篇文章: Updating a list of foreign keys in EF4, using MVC 2 Repository Viewmodel Pattern

我不知道爲什麼使用一個主鍵代替複合會誤事的。

+0

當我有機會時,我必須深入瞭解一下,但有一個有趣的區別是,如果您有一個自動遞增主鍵,EF *可以*插入一個重複項,但如果它是一個複合鍵,它*可以「T *。有趣的,的確如此。 –

+0

確實。現在,當我查看要添加的項目時,有3個 - 預期金額。在此之前,EF決定修改並添加相同的實體。所有非常奇怪。 – Sergio

相關問題