2010-10-18 63 views
0

好吧,我真的很苦惱如何更新MVC2/EF4中的外鍵列表。 我有一個模板對象可以有很多或沒有TemplateScenario對象之間的一對多關係。使用MVC 2更新EF4中的外鍵列表存儲庫Viewmodel模式

從本質上講,我有一個控制器的編輯方法是試圖做到這一點:

// POST: /Modes/Edit/1 
     [HttpPost] 
     public ActionResult Edit(int id, FormCollection formValues) 
     { 
      Template template = _templateRepository.GetTemplate(id); 

      TemplateCreateViewModel viewModel = new TemplateCreateViewModel(); 
      viewModel.Template = template; 
      viewModel.TemplateScenarioList = template.TemplateScenarios.ToList(); 

      //Update the model 
      UpdateModel(viewModel); 
      UpdateModel(viewModel.Template.TemplateScenarios, "TemplateScenarioList", new[] { "ScenarioID", "TemplateID" }); 

      _templateRepository.Save(); 

      return RedirectToAction("Edit", new { id = template.TemplateID }); 

     } 

此代碼成功更新了「模板」的對象。它還會添加'templatescenario'子對象,但只有當它是第一次將'templatescenarios'添加到此特定模板時纔會添加。如果有任何templatescenario對象已經存在一個給定的模板,我嘗試以新的名單上更新它們,我得到這個錯誤:

"The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted."

的_templateRepository.Save();只是調用entities.SaveChanges()EF4方法。

我可以templatescenario ID列表傳遞到我的倉庫類中的自定義「更新」的方法,看起來像這樣在一個骯髒的方式解決這個問題:

public void Update(Template template, IList<int> templateScenarios) 
    { 

     //Delete Old Entries 
     foreach (TemplateScenario ts in entities.TemplateScenarios) 
     { 
      if (ts.TemplateID == template.TemplateID) 
      { 
       if (templateScenarios == null) 
        entities.TemplateScenarios.DeleteObject(ts); 
       else if (!templateScenarios.Where(tsl => tsl == ts.ScenarioID).Any()) 
        entities.TemplateScenarios.DeleteObject(ts); 
      } 
     } 

     //Don't need to add anything if they are null. 
     if (templateScenarios == null) 
      return; 

     //Add New Entries 
     foreach (int ts in templateScenarios) 
     { 
      if (!entities.TemplateScenarios.Where(tsc => tsc.ScenarioID == ts && tsc.TemplateID == template.TemplateID).Any()) 
      { 
       TemplateScenario tempScenToAdd = new TemplateScenario(); 
       tempScenToAdd.ScenarioID = ts; 
       tempScenToAdd.TemplateID = template.TemplateID; 
       entities.TemplateScenarios.AddObject(tempScenToAdd); 
      } 
     } 

    } 

但這只是覺得髒,我認爲我與第一個更自動的方法非常接近。我搜索了互聯網,在stackoverflow上發現了一些類似的帖子,但是我發現很難達到這個'aha'時刻。

謝謝,

湯姆。

回答

0

可喜的是,我整理了我的問題。

問題是我的連接表錯誤地使用它自己的主鍵而不是使用基於兩個外鍵的組合鍵。這顯然是錯誤的/不好的做法,EF4和UpdateModel()不會很好。

我從一位前同事繼承了DB設計,因此把db設計看成是正確的,而沒有考慮太多。我知道,我很愚蠢。

+0

你知道爲什麼特定的數據庫設計導致了這個問題嗎?爲什麼在使用自己的主鍵而不是組合鍵時,表會引起問題? – Sergio 2011-07-10 22:35:23