1

我在更新实体后无法保存它们。我可以像这样添加新实体:add(student); 但如果我尝试这个:

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

我收到此错误消息:

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException 未由用户代码处理
Message=Store 更新、插入或删除语句影响了意外的行数 (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");
      }

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

4

1 回答 1

2

for当我在这里查看代码时,我最初的想法是,让一个循环多次更新a​​nd 对象student然后enrollment只调用一次db.SaveChanges循环外部似乎不太正确。这是令人担忧的,因为for当数据保存到数据库时,只会应用循环的最后一次迭代。(您在循环结束时有“更新行”的注释for- 也许某些代码丢失或放错了位置?)

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

最后,在假设该db对象可能像 MS LINQ-to-SQL 功能一样工作之后,我注意到该对象是在循环student之前新实例化的。for这对于插入新数据来说很好,但是如果您想更新现有数据,我相信您需要先从数据库中获取对象的副本,然后再更新属性。这允许db对象监视更改(再次假设它具有此功能)。(如果不是这种情况,那么它让我想知道如何知道数据库中的哪条记录要更新,因为您没有在循环中的对象上db设置任何看起来是主键的东西,例如。)StudentIdstudent

于 2012-07-16T01:50:48.210 回答