2012-07-16 106 views
1

更新后我无法保存实体。我可以添加这样的新实体:add(student);但如果我尝试这样做:为什么我的代码无法更新数据库?

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

我收到此错误信息:

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

你能帮我只能够在数据库中更新值?

+0

有没有变化?或者正在发送一个EntityState.Modified未修改的项目?即。这是否发生在AllFstMNames.Count()== 0? – 2012-07-16 01:21:19

回答

2

虽然我一直在寻找在这里的代码,我最初的想法是,它似乎并不具有for循环,更新studentenrollment对象多次,然后有以外唯一一个呼叫db.SaveChanges完全正确循环。这是有关的,因为只有当数据保存到数据库时,才会应用for循环的最后一次迭代。 (您在for循环末尾有“更新行”的注释 - 可能某些代码丢失或放错位置了?)

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

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

+0

感谢您的反馈,我没有意识到我的问题太模糊。我将从第一个点开始重做代码......更新多次,但只保存上次更新。再次感谢。 – CloudyKooper 2012-07-16 03:02:07

相关问题