多対多の関係を持つ ChangeRequest オブジェクトと BusinessArea オブジェクトがあります。結合テーブルがあります: ChangeRequestBusinessArea.
BusinessAreaID が 2、7、8、および 10 の新しい ChangeRequest を作成して保存すると、結合テーブルが正常に更新されます。
例えば
ChangeRequestID BusinessAreaID
1 2
1 7
1 8
1 10
しかし、同じ ChangeRequest を BusinessAreaID 1、2、3、7、および 10 で編集して保存すると、次のようになります。
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);
}
}
}