我有一个类Activity
,它与一些部门相关联。实体框架:更新对象失败,重复键
public class Activity
{
...
public int Id { get; set; }
public virtual List<Department> ParticipantDepartments { get; set; }
}
这是控制器中的动作,它接受用户的编辑。在用户编辑之前,activity
已经与数据库中的某个ParticipantDepartments
相关联。现在我们假设用户修改ParticipantDepartments
,然后在POST方法更改ParticipantDepartments
到新的用户定义的一个:
// POST: Activities/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(
EditActivityViewModel editActivityViewModel)
{
if (ModelState.IsValid)
{
Activity activity = db.Activities.Find(editActivityViewModel.ActivityId);
activity.
Category = editActivityViewModel.Category;
activity.DetailedLocation = editActivityViewModel.DetailedLocation;
activity.District = editActivityViewModel.District;
activity.Linkman = editActivityViewModel.Linkman;
activity.Phone = editActivityViewModel.Phone;
activity.Title = editActivityViewModel.Title;
activity.TotalParticipantsAmount = editActivityViewModel.TotalParticipantsAmount;
activity.particular = editActivityViewModel.particular;
activity.OriginatorId = User.Identity.GetUserId();
activity.ParticipantDepartments = GetParticipantDepartments(editActivityViewModel.SelectedDepartmentIds);
List<Models.ActivityTime> activityTimes = new List<Models.ActivityTime>();
foreach (var item in editActivityViewModel.ActivityTimes)
{
Models.ActivityTime activityTime = new Models.ActivityTime
{
StartTime = item.StartDate + item.StartTime,
EndTime = item.EndDate + item.Endtime
};
activityTimes.Add(activityTime);
}
activity.AcvitityTimes = activityTimes;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(editActivityViewModel);
}
然而,asp.net暗示
违反PRIMARY KEY约束“PK_dbo.DepartmentActivities ”。 无法在对象'dbo.DepartmentActivities'中插入重复键。 重复的键值是(13,1008)。
该声明已被终止 。
发生在用户修改ParticipantDepartments
时,但仍有部分与以前相同,可以接受。但是,实体框架似乎不知道它。所以它只是在表dbo.DepartmentActivities
中插入一条新记录。
问题是,如何解决这个问题?我应该找到某种方式来“先删除数据库中的所有相关部门,然后更新activity
像我张贴在这里,还是应该找到某种方式来让实体框架知道我已经跟activity
?
相关的一些部门
编辑:
private List<Department> GetParticipantDepartments(List<List<int>> selectedDepartmentIds)
{
List<Department> departments = new List<Department>();
foreach (var selectedDepartmentId in selectedDepartmentIds)
{
departments.Add(AccountController.GetDepartment(selectedDepartmentId, db));
}
return departments;
}
你能告诉我GetParticipantDepa rtments(editActivityViewModel.SelectedDepartmentIds);方法 – jitender
@jitender请参阅更新。 – guo
@jitender'GetParticipantDepartments'只分析用户的输入并返回'List' –
guo