【问题标题】:updating and deleting record through model binding in asp.net mvc通过asp.net mvc中的模型绑定更新和删除记录
【发布时间】:2016-08-04 04:42:07
【问题描述】:

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

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(template).State = EntityState.Modified; 给出错误。如何删除记录。我在代码中缺少什么。

【问题讨论】:

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


    【解决方案1】:

    如果您能与我们分享错误,那就太好了。但是查看您的代码,您所面临的错误可能是因为您试图删除循环内的某些记录而这不起作用。

    您可以通过仅将要删除的记录的 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();
             }
         }
    

    【讨论】:

    • 我没有删除循环中的记录。我只是在对象列表中添加并在循环完成后删除。我希望通过修改实体状态通过一个对象列表进行操作。
    • 这是你做不到的。这就是我要说的...... foreach(CheckListQuestion qst in delQuestions) { var itemToRemove = template.Questions.Single(r => r.Id == qst.Id);模板.问题.删除(qst);如果出于某种原因你真的需要这样做,请使用 for 而不是 foreach。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多