一对多关系将另一个值设置为 false

One to Many Relationship setting another value to false

我有2个表格。一个称为 Help,另一个称为 HelpSolution。帮助可以有很多解决方案。这是他们的模型。

public class Help
{
    public int ID { get; set; }
    public string Description { get; set; }
    public Priority? Priority { get; set; }
    public bool Condition { get; set; }
    public int? EmployeeID { get; set; }
    public int? HelpCategoryID { get; set; }
    public int? HelpTypeID { get; set; }
    public virtual Employee Employee { get; set; }
    public virtual HelpCategory HelpCategory { get; set; }
    public virtual HelpType HelpType { get; set; }
    public virtual ICollection<HelpSolution> HelpSolutions { get; set; }
}

(是的,我知道,它有很多值,这里最不重要,重要的是最后一个)

public class HelpSolution
{
    public int ID { get; set; }
    public string Solution { get; set; }
    public virtual int? HelpID { get; set; }
    public virtual Help Help { get; set; }
    public bool Selected { get; set; }

}

在“帮助视图”中,我创建了一个名为“提交”的新操作,我在其中基本上使用复选框确认哪些解决方案有效。在该表格中,我在复选框中显示了该特定帮助(使用 HelpID)的解决方案。我想做一个表单,在其中提交,按下复选框,它将数据库中的 HelpSolution 值从 false 更改为 true,因为我正在区分它已被选为有效解决方案(帮助可以有很多解决方案和许多有效的解决方案)。

我在控制器中创建了一个ActionResult,但是它很垃圾所以我来这里寻求帮助我该怎么做?非常感谢任何帮助。

这是行动:

public ActionResult Submit(int id)
    {
       HelpViewModel help = Mapper.Map<Help, 
       HelpViewModel(unitOfWork.HelpRepository.GetByID(id));
        if (help == null)
        {
            return HttpNotFound();
        }
        return View(help);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Submit(HelpViewModel model)
    {
        if (ModelState.IsValid)
        {

            Help help = Mapper.Map<Help>(model);
            AddOrUpdateSolutions(help, model.HelpSolutions);
            unitOfWork.HelpRepository.Update(help);
            unitOfWork.Save();
            return RedirectToAction("Details", new { id = model.ID });
        }
        return View(model);
    }

我尝试设置值的操作是 AddOrUpdateSolutions,但我写得很糟糕,所以我认为它没有帮助。我只需要知道我应该如何去做这件事。

好吧,我自己找到了一个解决方案,可能很糟糕,但它有效,我没有其他想法。

    public ActionResult Submit(int id)
    {
        HelpViewModel help = Mapper.Map<Help, HelpViewModel>(unitOfWork.HelpRepository.GetByID(id));
        if (help == null)
        {
            return HttpNotFound();
        }
        return View(help);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Submit(HelpViewModel model)
    {
        if (ModelState.IsValid)
        {
            Help help = Mapper.Map<HelpViewModel,Help>(model);
            model.HelpSolutions = PopulateSolutionData(model.ID);

            foreach (var solution in help.HelpSolutions)
            {
                var entityItem = db.HelpSolutions.FirstOrDefault(s => s.ID == solution.ID);
                if (solution.Selected == true){
                        entityItem.Selected = true;
                }
                else{
                    entityItem.Selected = false;
                }
                db.Entry(entityItem).State = EntityState.Modified;
                db.SaveChanges();
            }

            return RedirectToAction("Details", new { id = model.ID });
        }
        return View(model);
    }

PopulateSolutionData 只是从数据库中填充解决方案并将它们全部设置为 false。基本上解决这个问题的方法是使用 db 而不是 UnitOfWork,并且只是使用 if 设置值并将实体状态设置为已修改。