記事はhow to update related data with the Entity Framework in an ASP.NET MVC applicationです。インストラクターとしてあなたのコースを選ぶことができるシンプルな大学を実装しています。あなたはUpdateInstructorCourses
は、文字列の配列であるselectedCourses
に基づいてから取得したオブジェクトとinstructorToUpdate.Courses
を埋め見ることができるように関連データを作成/更新するためにdbからオブジェクトを取得する必要がありますか?
private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate)
{
if (selectedCourses == null)
{
instructorToUpdate.Courses = new List<Course>();
return;
}
var selectedCoursesHS = new HashSet<string>(selectedCourses);
var instructorCourses = new HashSet<int>
(instructorToUpdate.Courses.Select(c => c.CourseID));
foreach (var course in db.Courses)
{
if (selectedCoursesHS.Contains(course.CourseID.ToString()))
{
if (!instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Add(course);
}
}
else
{
if (instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Remove(course);
}
}
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int? id, string[] selectedCourses)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var instructorToUpdate = db.Instructors
.Include(i => i.Courses)
.Where(i => i.ID == id)
.Single();
if (TryUpdateModel(instructorToUpdate, "",
new string[] { "LastName", "FirstMidName", "HireDate", "OfficeAssignment" }))
{
try
{
UpdateInstructorCourses(selectedCourses, instructorToUpdate);
db.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception e)
{
//Log the error
}
}
PopulateAssignedCourseData(instructorToUpdate);
return View(instructorToUpdate);
}
:ここ
は、そのコースのコントローラのバージョンに簡略化されます。
多対多リレーションシップを作成する唯一の方法はありますか? db
からAdd
のオブジェクトを取得する必要がありますか?関連オブジェクトのIDと更新関連データだけを渡す方が良いのではないでしょうか?
素晴らしい。 Fluent APIのようなものを使って 'InstructorCourse'を導入する方法はありますか?追加のモデルは必要ありませんか? – Mowji
@Mowjiいいえ、私は別の方法を知りません。他の唯一のオプションは、raw SQLを使用してマッピングテーブルから手動で挿入/削除することです(明らかにネガティブです)。 –