我在更新后保存我的实体时遇到问题。我可以添加这样的新实体: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");
}
你能帮助我更新数据库中的值吗?
答案 0 :(得分:2)
在我查看此处的代码时,我最初的想法是,使用for
循环多次更新student
和enrollment
对象似乎不太合适然后在循环外只有一次调用db.SaveChanges
。这是令人担忧的,因为当数据保存到数据库时,只会应用for
循环的最后一次迭代。 (您在for
循环结尾处有“更新行”的注释 - 可能有些代码丢失或放错位置?)
然后,我开始思考为什么需要手动设置Entry(...).State
属性。 db
不会自动知道某个对象已被修改并需要保存吗?这引出了我的问题:db
定义在哪里?那里使用了什么技术堆栈?
最后,假设db
对象可能与MS LINQ-to-SQL功能类似,我注意到student
对象在{{1}之前新实例化了}循环。这适用于插入新数据,但如果您想要更新现有数据,我相信您需要先从数据库中获取该对象的副本,然后更新属性。这允许for
对象监视更改(同样,假设它具有此功能)。 (如果不是这种情况,那么我会想知道db
将如何知道要更新的数据库中的哪条记录,因为您没有设置任何看似是主键的记录,例如{{1} },在循环中的db
对象上。)