通过asp.net中的模型绑定更新和删除记录mvc

时间:2016-08-04 04:42:08

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我从存在父和子列表的视图中发布模型对象,并且我正在从数据库中获取另一个对象。所以我正在比较像

这样的对象
public bool ChildRecords(CheckListTemplate questList)
        {
            int templateId = questList.Id;
            if (templateId > 0 && questList.Questions.Count() > 0)
            {
                var template =DBContext.CheckListTemplates.Include(p => p.Questions).SingleOrDefault(p => p.Id == templateId);
                template.Name = questList.Name;
                List<CheckListQuestion> delQuestions = new List<CheckListQuestion>();
                foreach(CheckListQuestion q in template.Questions)
                {
                    var question = questList.Questions.Where(x => x.Id == q.Id).FirstOrDefault();
                    if (question == null)
                    {
                                               delQuestions.Add(q);
                    }
                    else
                    {
                        q.Question = question.Question;
                        q.Clause = question.Clause;
                    }
                }
                if(delQuestions.Count()>0)
                {
                    foreach(CheckListQuestion qst in  delQuestions)
                    {
                        var itemToRemove = template.Questions.Single(r => r.Id == qst.Id);
                        template.Questions.Remove(qst);
                    }
                }                
DBContext.Entry(template).State = EntityState.Modified;
                DBContext.SaveChanges();
}

我正在更新和删除记录。如果我更新记录功能工作正常,但当我删除记录并发布视图然后DBContext.Entry(模板).State = EntityState.Modified;  正在给出错误。如何删除记录。我在代码中遗漏了什么。

1 个答案:

答案 0 :(得分:0)

如果您能与我们分享错误,那将是件好事。但是看看你的代码,可能你遇到的错误是因为你试图删除一个循环中的一些记录而这是行不通的。

您可以通过在内存中仅存储要删除的记录的ID来简化代码。例如:

    public bool ChildRecords(CheckListTemplate questList)
    {
        int templateId = questList.Id;
        if (templateId > 0 && questList.Questions.Count() > 0)
        {
            var template = DBContext.CheckListTemplates.Include(p => p.Questions).SingleOrDefault(p => p.Id == templateId);
            template.Name = questList.Name;
            List<int> delQuestions = new List<int>();
            foreach(CheckListQuestion q in template.Questions)
            {
                var question = questList.Questions.Where(x => x.Id == q.Id).FirstOrDefault();
                if (question == null)
                   delQuestions.Add(q.Id);
                else
                {
                    q.Question = question.Question;
                    q.Clause = question.Clause;
                }
            }

            if(delQuestions.Count()>0)
               DBContext.CheckListTemplates.RemoveRange(DBContext.CheckListTemplates.Where(x => ids.Contains(x.Id)));

            DBContext.Entry(template).State = EntityState.Modified;
            DBContext.SaveChanges();
         }
     }