1

エンティティを更新した後、エンティティを保存するのに問題があります。次のように新しいエンティティを追加できます。しかし、私がこれを試した場合:

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

次のエラー メッセージが表示されます。

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException はユーザー コードによって処理され
ませんでした Message=Store update、insert、または delete ステートメントが予期しない数の行 (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

ここのコードを見ていて最初に思ったのは、 andオブジェクトを複数回for更新するループを作成し、そのループの外側を 1 回だけ呼び出すのは適切ではないように思われるということです。データがデータベースに保存されるときに、ループの最後の反復のみが適用されるため、これは懸念事項です。(ループの最後に「行を更新する」というコメントがあります。おそらく、一部のコードが欠落しているか、場所が間違っていますか?)studentenrollmentdb.SaveChangesforfor

Entry(...).State次に、プロパティを手動で設定する必要がある理由について考え始めました。dbオブジェクトが変更され、保存する必要があることを自動的に認識しませんか? それは私をこの質問に導きました:どこでdb定義されていますか? そこではどのような技術スタックが使用されていますか?

db最後に、オブジェクトが MS LINQ-to-SQL 機能のように機能する可能性があると仮定した後、オブジェクトがループstudentの前に新しくインスタンス化されていることに気付きました。forこれは新しいデータの挿入には問題ありませんが、既存のデータを更新する場合は、まずデータベースからオブジェクトのコピーを取得してからプロパティを更新する必要があると思います。これにより、dbオブジェクトは変更を監視できます (この機能があると仮定します)。(これが当てはまらない場合、ループ内のオブジェクトにdbなどの主キーと思われるものを設定していないため、データベース内のどのレコードを更新するかを がどのように認識するのか疑問に思います。)StudentIdstudent

于 2012-07-16T01:50:48.210 に答える