好吧,我真的很苦惱如何更新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'時刻。
謝謝,
湯姆。
你知道爲什麼特定的數據庫設計導致了這個問題嗎?爲什麼在使用自己的主鍵而不是組合鍵時,表會引起問題? – Sergio 2011-07-10 22:35:23