2017-02-24 69 views
0

我有一个类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; 
     } 
+0

你能告诉我GetParticipantDepa rtments(editActivityViewModel.SelectedDepartmentIds);方法 – jitender

+0

@jitender请参阅更新。 – guo

+0

@jitender'GetParticipantDepartments'只分析用户的输入并返回'List ' – guo

回答

0

我认为SelectedDepartmentIdsList<int>

//this will add new departments 

var newDepartmentIds = editActivityViewModel.SelectedDepartmentIds.Where(sdid => activity.ParticipantDepartments.All(pd => pd.Id != sdid)).ToList(); 

activity.ParticipantDepartments.Add(GetParticipantDepartments(newDepartmentIds)); 

//if you also want to remove the departments those are not in editActivityViewModel.SelectedDepartmentIds 

activity.ParticipantDepartments.RemoveRange(activity.ParticipantDepartments.Where(apd => editActivityViewModel.SelectedDepartmentIds.All(sdid => sdid != apd.Id)))