public async Task <IActionResult> Edit(int?id, byte[] rowVersion) { if (id == null) { return(NotFound()); } var departmentToUpdate = await _context.Departments.Include(i => i.Administrator).SingleOrDefaultAsync(m => m.DepartmentID == id); if (departmentToUpdate == null) { Department deletedDepartment = new Department(); await TryUpdateModelAsync(deletedDepartment); ModelState.AddModelError(string.Empty, "Unable to save changes. The department was deleted by another user."); ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName", deletedDepartment.InstructorID); return(View(deletedDepartment)); } _context.Entry(departmentToUpdate).Property("RowVersion").OriginalValue = rowVersion; if (await TryUpdateModelAsync <Department>( departmentToUpdate, "", s => s.Name, s => s.StartDate, s => s.Budget, s => s.InstructorID)) { try { await _context.SaveChangesAsync(); return(RedirectToAction("Index")); } catch (DbUpdateConcurrencyException ex) { var exceptionEntry = ex.Entries.Single(); var clientValues = (Department)exceptionEntry.Entity; var databaseEntry = exceptionEntry.GetDatabaseValues(); if (databaseEntry == null) { ModelState.AddModelError(string.Empty, "Unable to save changes. The department was deleted by another user."); } else { var databaseValues = (Department)databaseEntry.ToObject(); if (databaseValues.Name != clientValues.Name) { ModelState.AddModelError("Name", $"Current value: {databaseValues.Name}"); } if (databaseValues.Budget != clientValues.Budget) { ModelState.AddModelError("Budget", $"Current value: {databaseValues.Budget:c}"); } if (databaseValues.StartDate != clientValues.StartDate) { ModelState.AddModelError("StartDate", $"Current value: {databaseValues.StartDate:d}"); } if (databaseValues.InstructorID != clientValues.InstructorID) { Instructor databaseInstructor = await _context.Instructors.SingleAsync(i => i.ID == databaseValues.InstructorID); ModelState.AddModelError("InstructorID", $"Current value: {databaseInstructor.FullName}"); } ModelState.AddModelError(string.Empty, "The record you attempted to edit " + "was modified by another user after you got the original value. The " + "edit operation was canceled and the current values in the database " + "have been displayed. If you still want to edit this record, click " + "the Save button again. Otherwise click the Back to List hyperlink."); departmentToUpdate.RowVersion = (byte[])databaseValues.RowVersion; ModelState.Remove("RowVersion"); } } } ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName", departmentToUpdate.InstructorID); return(View(departmentToUpdate)); }
public async Task OnGetAsync(int?id, int?courseID) { Instructor = new InstructorIndexData(); Instructor.Instructors = await _context.Instructors .Include(i => i.OfficeAssignment) .Include(i => i.CourseAssignments) .ThenInclude(i => i.Course) .ThenInclude(i => i.Department) // .Include(i => i.CourseAssignments) // .ThenInclude(i => i.Course) // .ThenInclude(i => i.Enrollments) // .ThenInclude(i => i.Student) //.AsNoTracking() 取消显示全部加载, .OrderBy(i => i.LastName) .ToListAsync(); /* SELECT[i].[ID], [i].[FirstName], [i].[HireDate], [i].[LastName], [i.OfficeAssignment].[InstructorID], [i.OfficeAssignment].[Location] * FROM[Instructor] AS[i] * LEFT JOIN[OfficeAssignment] AS[i.OfficeAssignment] ON[i].[ID] = [i.OfficeAssignment].[InstructorID] * ORDER BY[i].[LastName], [i].[ID] * * 生成一下两个查询,效率感觉很低呀 * * SELECT[i.CourseAssignments].[CourseID], [i.CourseAssignments].[InstructorID], [c.Course].[CourseID], [c.Course].[Credits], [c.Course].[DepartmentID], [c.Course].[Title] * FROM[CourseAssignment] AS[i.CourseAssignments] * I NNER JOIN[Course] AS[c.Course] ON[i.CourseAssignments].[CourseID] = [c.Course].[CourseID] * INNER JOIN( * SELECT DISTINCT [i0].[ID], [i0].[LastName] * FROM [Instructor] AS [i0] * LEFT JOIN [OfficeAssignment] AS[i.OfficeAssignment0] ON [i0].[ID] = [i.OfficeAssignment0].[InstructorID] * ) AS[t] ON[i.CourseAssignments].[InstructorID] = [t].[ID] * ORDER BY[t].[LastName], [t].[ID] */ //if (id != null) //{ // InstructorID = id.Value; // Instructor instructor = Instructor.Instructors.Where(i => i.ID == id.Value).Single(); //集合仅包含一个选项的时候才能用,空或者多个都会报异常 // Instructor.Courses = instructor.CourseAssignments.Select(s => s.Course); //} //if (courseID != null) //{ // CourseID = courseID.Value; // Instructor.Enrollments = Instructor.Courses.Where(x => x.CourseID == courseID).Single().Enrollments; //} if (id != null) { InstructorID = id.Value; Instructor instructor = Instructor.Instructors.Single(//直接在Single里面调用where条件 i => i.ID == id.Value); Instructor.Courses = instructor.CourseAssignments.Select( s => s.Course); } //if (courseID != null) //{ // CourseID = courseID.Value; // Instructor.Enrollments = Instructor.Courses.Single( // x => x.CourseID == courseID).Enrollments; //} 用下列进行显示load加载 if (courseID != null) { CourseID = courseID.Value; var selectedCourse = Instructor.Courses.Where(x => x.CourseID == courseID).Single(); await _context.Entry(selectedCourse).Collection(x => x.Enrollments).LoadAsync(); foreach (Enrollment enrollment in selectedCourse.Enrollments) { await _context.Entry(enrollment).Reference(x => x.Student).LoadAsync(); } Instructor.Enrollments = selectedCourse.Enrollments; } }