2013-04-07 44 views
0

我有一个ChangeRequest对象和一个具有多对多关系的BusinessArea对象。有一个连接表:ChangeRequestBusinessArea。错误地更新多对多连接表

如果我使用BusinessAreaIDs 2,7,8和10创建并保存新的ChangeRequest,那么连接表更新就好了。

例如

ChangeRequestID BusinessAreaID 
1    2 
1    7 
1    8 
1    10 

但是当我然后编辑并保存BusinessAreaIDs 1,2,3,7和10相同ChangeRequest,我得到如下:

ChangeRequestID BusinessAreaID 
1    2 
1    7 
1    8 
1    10 
1    11 
1    12 
1    13 
1    14 
1    15 

下面是代码:

namespace MOC.Models 
{ 
public class ChangeRequest 
{ 
    public ChangeRequest() 
    { 
     BusinessAreas = new List<BusinessArea>(); 
    } 

    public int ChangeRequestID { get; set; } 
    public string ChangeRequestName { get; set; } 

    public virtual ICollection<BusinessArea> BusinessAreas { get; set; } 
} 
} 

namespace MOC.Models 
{ 
public class BusinessArea 
{ 
    public int BusinessAreaID { get; set; } 
    public string BusinessAreaName { get; set; } 

    public virtual ICollection<ChangeRequest> ChangeRequests { get; set; } 
} 
} 

操作方法

[HttpPost] 
public ActionResult Edit(int id, ChangeRequestViewModel ChangeRequestViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var changeRequest = new ChangeRequest 
     { 
      ChangeRequestID = id 
     }; 

     AddOrUpdateBusinessAreas(changeRequest, ChangeRequestViewModel.BusinessAreas); 
     db.Entry(changeRequest).State = EntityState.Modified; 
     db.SaveChangeRequests(); 

     return RedirectToAction("Index"); 
     } 
     return View(ChangeRequestViewModel); 
    } 

    private void AddOrUpdateBusinessAreas(ChangeRequest ChangeRequest, IEnumerable<AssignedBusinessAreaData> assignedBusinessAreas) 
    { 
     foreach (var assignedBusinessArea in assignedBusinessAreas) 
     { 
      if (assignedBusArea.Assigned) { 
       var busarea = new BusArea { BusAreaID = assignedBusArea.BusAreaID }; 
       Change.BusAreas.Add(busarea); 
      } else { 
       var busarea = new BusArea { BusAreaID = assignedBusArea.BusAreaID }; 
       Change.BusAreas.Remove(busarea); 
      } 
     } 
    } 

回答

1

必须从包括当前与它为了能够删除关系BusinessArea S上的数据库加载ChangeRequest

我假设ChangeRequestViewModel.AssignedBusinessAreaData包含所有可能的带有标志的区域Assigned如果该区域必须被分配给ChangeRequest或不是。那么你的行动方式可能看起来类似于:

[HttpPost] 
public ActionResult Edit(int id, ChangeRequestViewModel ChangeRequestViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var changeRequest = db.ChangeRequests 
      .Include(c => c.BusinessAreas) // Important ! 
      .Single(c => c.ChangeRequestID == id); 

     foreach (var assignedBusArea in ChangeRequestViewModel.BusinessAreas) 
     { 
      if (assignedBusArea.Assigned) 
      { 
       if (!changeRequest.BusinessAreas 
        .Any(b => b.BusinessAreaID == assignedBusArea.BusAreaID)) 
       { 
        var busArea = new BusinessArea 
        { 
         BusAreaID = assignedBusArea.BusAreaID 
        }; 
        db.BusinessAreas.Attach(busArea); 
        // Attach is important to avoid duplication of the area 
        changeRequest.BusinessAreas.Add(busArea); 
       } 
       // else do nothing if the assigned area 
       // already belongs to the changeRequest 
      } 
      else 
      { 
       var busArea = changeRequest.BusinessAreas.SingleOrDefault(
        b => b.BusinessAreaID == assignedBusArea.BusAreaID); 
       if (busArea != null) 
        changeRequest.BusinessAreas.Remove(busArea); 
       // else do nothing if the unassigned area 
       // does not belong to the changeRequest anyway 
      } 
     } 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    }    

    return View(ChangeRequestViewModel); 
} 
+0

完美。 :) 非常感谢。 – user1405195 2013-04-07 18:55:41