为什么我的代码无法更新数据库?

时间:2012-07-16 01:03:51

标签: asp.net-mvc

我在更新后保存我的实体时遇到问题。我可以添加这样的新实体:add(student);但如果我试过这个:

if (ModelState.IsValid)
{
   db.Entry(student).State = EntityState.Modified;
   db.SaveChanges();
   return RedirectToAction("someView");
}

我收到此错误消息:

  

用户代码未处理System.Data.Entity.Infrastructure.DbUpdateConcurrencyException   Message =存储更新,插入或删除语句影响了意外的行数(0)。实体可能已被修改或   自实体加载后删除。刷新ObjectStateManager   条目。

这是我的控制器方法:

[HttpPost]
public ActionResult ClassAttendance(InstructorIndexData viewModel, FormCollection frmcol)
{
     var instructorData = new InstructorIndexData();

     string[] AllFstMNames = frmcol["item.Student.FirstMidName"].Split(',');
     string[] AllLstNames = frmcol["item.Student.LastName"].Split(',');
     string[] AllAddresses = frmcol["item.Student.Address"].Split(',');
     string[] AllEnrollmentDates = frmcol["item.Student.EnrollmentDate"].Split(',');
     //more of the same code…

     var student = new Student();
     var enrollment = new Enrollment();

     for ( int i = 0; i < AllFstMNames.Count(); i++)
     {
         student.FirstMidName = AllFstMNames[i];
         student.LastName = AllLstNames[i];
         student.Address = AllAddresses[i];
         student.EnrollmentDate = Convert.ToDateTime(AllEnrollmentDates[i]);

         if (!string.IsNullOrEmpty(frmcol["item.Grade"]))
         {
            enrollment.Grade = Convert.ToInt32(AllGrades[i]);
         }

         enrollment.StudentID = Convert.ToInt32(AllStudentIds[i]);
         enrollment.attendanceCode = Convert.ToInt32(AllAttendanceCodes[i]);
         enrollment.classDays = AllclassDays[i];
         enrollment.CourseID = Convert.ToInt32 (AllCourseIds[i]);
         //update rows
      }

      if (ModelState.IsValid)
      {
         db.Entry(student).State = EntityState.Modified;
         db.SaveChanges();
         return RedirectToAction("someView");
      }

你能帮助我更新数据库中的值吗?

1 个答案:

答案 0 :(得分:2)

在我查看此处的代码时,我最初的想法是,使用for循环多次更新studentenrollment对象似乎不太合适然后在循环外只有一次调用db.SaveChanges。这是令人担忧的,因为当数据保存到数据库时,只会应用for循环的最后一次迭代。 (您在for循环结尾处有“更新行”的注释 - 可能有些代码丢失或放错位置?)

然后,我开始思考为什么需要手动设置Entry(...).State属性。 db不会自动知道某个对象已被修改并需要保存吗?这引出了我的问题:db定义在哪里?那里使用了什么技术堆栈?

最后,假设db对象可能与MS LINQ-to-SQL功能类似,我注意到student对象在{{1}之前新实例化了}循环。这适用于插入新数据,但如果您想要更新现有数据,我相信您需要先从数据库中获取该对象的副本,然后更新属性。这允许for对象监视更改(同样,假设它具有此功能)。 (如果不是这种情况,那么我会想知道db将如何知道要更新的数据库中的哪条记录,因为您没有设置任何看似是主键的记录,例如{{1} },在循环中的db对象上。)