У меня есть отношение "много-ко-многим" между Issues
и Scopes
в моем EF-контексте. В ASP.NET MVC я открываю форму "Редактировать", которая позволяет пользователю редактировать конкретную проблему. В нижней части формы представлен список флажков, которые позволяют им выбирать, какие области применения относятся к этой проблеме. При редактировании проблемы у него, вероятно, всегда будет некоторое количество связанных с ним областей - эти поля уже будут проверены. Тем не менее, у пользователя есть возможность проверить больше областей или удалить некоторые из проверенных в настоящее время областей. Мой код выглядел примерно так, чтобы сохранить только проблему:
using (var edmx = new MayflyEntities())
{
Issue issue = new Issue { IssueID = id, TSColumn = formIssue.TSColumn };
edmx.Issues.Attach(issue);
UpdateModel(issue);
if (ModelState.IsValid)
{
//if (edmx.SaveChanges() != 1) throw new Exception("Unknown error. Please try again.");
edmx.SaveChanges();
TempData["message"] = string.Format("Issue #{0} successfully modified.", id);
}
}
Итак, когда я пытаюсь добавить в логику, чтобы сохранить связанные области, я пробовал несколько вещей, но в конечном итоге это и имело для меня наибольший смысл:
using (var edmx = new MayflyEntities())
{
Issue issue = new Issue { IssueID = id, TSColumn = formIssue.TSColumn };
edmx.Issues.Attach(issue);
UpdateModel(issue);
foreach (int scopeID in formIssue.ScopeIDs)
{
var thisScope = new Scope { ID = scopeID };
edmx.Scopes.Attach(thisScope);
thisScope.ProjectID = formIssue.ProjectID;
if (issue.Scopes.Contains(thisScope))
{
issue.Scopes.Attach(thisScope); //the scope already exists
}
else
{
issue.Scopes.Add(thisScope); // the scope needs to be added
}
}
if (ModelState.IsValid)
{
//if (edmx.SaveChanges() != 1) throw new Exception("Unknown error. Please try again.");
edmx.SaveChanges();
TempData["message"] = string.Format("Issue #{0} successfully modified.", id);
}
}
Но, к сожалению, это просто вызывает следующее исключение:
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
Что я делаю неправильно?