Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Tom Dykstra
Aplikasi web sampel Contoso University menunjukkan cara membuat aplikasi ASP.NET MVC 4 menggunakan Entity Framework 5 Code First dan Visual Studio 2012. Untuk informasi tentang seri tutorial, lihat tutorial pertama dalam seri ini.
Catatan
Jika Anda mengalami masalah yang tidak dapat Anda atasi, unduh bab yang telah selesai dan coba reprodurasi masalah Anda. Anda umumnya dapat menemukan solusi untuk masalah dengan membandingkan kode Anda dengan kode yang telah selesai. Untuk beberapa kesalahan umum dan cara mengatasinya, lihat Kesalahan dan Solusi.
Dalam tutorial sebelumnya Anda menyelesaikan model data Sekolah. Dalam tutorial ini Anda akan membaca dan menampilkan data terkait — yaitu, data yang dimuat Kerangka Kerja Entitas ke dalam properti navigasi.
Ilustrasi berikut ini memperlihatkan halaman yang akan Anda kerjakan.
Malas, Bersemangat, dan Eksplisit Memuat Data Terkait
Ada beberapa cara agar Kerangka Kerja Entitas dapat memuat data terkait ke dalam properti navigasi entitas:
Pemuatan malas. Saat entitas pertama kali dibaca, data terkait tidak diambil. Namun, pertama kali Anda mencoba mengakses properti navigasi, data yang diperlukan untuk properti navigasi tersebut diambil secara otomatis. Ini menghasilkan beberapa kueri yang dikirim ke database — satu untuk entitas itu sendiri dan satu setiap kali data terkait untuk entitas harus diambil.
Pemuatan bersemangat. Saat entitas dibaca, data terkait diambil bersama dengan entitas tersebut. Ini biasanya menghasilkan satu kueri gabungan yang mengambil semua data yang diperlukan. Anda menentukan pemuatan bersemangat dengan menggunakan
Includemetode .
Pemuatan eksplisit. Ini mirip dengan pemuatan malas, kecuali bahwa Anda secara eksplisit mengambil data terkait dalam kode; itu tidak terjadi secara otomatis saat Anda mengakses properti navigasi. Anda memuat data terkait secara manual dengan mendapatkan entri manajer status objek untuk entitas dan memanggil
Collection.Loadmetode untuk koleksi atauReference.Loadmetode untuk properti yang menyimpan satu entitas. (Dalam contoh berikut, jika Anda ingin memuat properti navigasi Administrator, Anda akan menggantiCollection(x => x.Courses)denganReference(x => x.Administrator).)
Karena tidak segera mengambil nilai properti, pemuatan malas dan pemuatan eksplisit juga keduanya dikenal sebagai pemuatan yang ditangguhkan.
Secara umum, jika Anda tahu Bahwa Anda memerlukan data terkait untuk setiap entitas yang diambil, pemuatan bersemangat menawarkan performa terbaik, karena satu kueri yang dikirim ke database biasanya lebih efisien daripada kueri terpisah untuk setiap entitas yang diambil. Misalnya, dalam contoh di atas, misalkan setiap departemen memiliki sepuluh kursus terkait. Contoh pemuatan yang bersemangat hanya akan menghasilkan satu kueri (gabungan) dan satu perjalanan pulang pergi ke database. Contoh pemuatan malas dan pemuatan eksplisit akan menghasilkan sebelas kueri dan sebelas perjalanan pulang pergi ke database. Perjalanan pulang pergi ekstra ke database sangat merugikan performa ketika latensi tinggi.
Di sisi lain, dalam beberapa skenario pemuatan malas lebih efisien. Pemuatan bersemangat dapat menyebabkan gabungan yang sangat kompleks dihasilkan, yang SQL Server tidak dapat diproses secara efisien. Atau jika Anda perlu mengakses properti navigasi entitas hanya untuk subset dari sekumpulan entitas yang Anda proses, pemuatan malas mungkin berperforma lebih baik karena pemuatan yang bersemangat akan mengambil lebih banyak data daripada yang Anda butuhkan. Jika performa sangat penting, yang terbaik adalah menguji performa keduanya untuk membuat pilihan terbaik.
Biasanya Anda akan menggunakan pemuatan eksplisit hanya ketika Anda telah menonaktifkan pemuatan malas. Salah satu skenario ketika Anda harus mematikan pemuatan malas adalah selama serialisasi. Pemuatan dan serialisasi malas tidak bercampur dengan baik, dan jika Anda tidak berhati-hati, Anda dapat mengkueri lebih banyak data secara signifikan daripada yang Anda inginkan saat pemuatan malas diaktifkan. Serialisasi umumnya berfungsi dengan mengakses setiap properti pada instans jenis. Akses properti memicu pemuatan malas, dan entitas yang dimuat malas tersebut diserialisasikan. Proses serialisasi kemudian mengakses setiap properti entitas yang dimuat malas, berpotensi menyebabkan pemuatan dan serialisasi yang lebih malas. Untuk mencegah reaksi rantai run-away ini, matikan pemuatan malas sebelum Anda menserialisasikan entitas.
Kelas konteks database melakukan pemuatan malas secara default. Ada dua cara untuk menonaktifkan pemuatan malas:
Untuk properti navigasi tertentu, hilangkan
virtualkata kunci saat Anda mendeklarasikan properti .Untuk semua properti navigasi, atur
LazyLoadingEnabledkefalse. Misalnya, Anda dapat meletakkan kode berikut di konstruktor kelas konteks Anda:this.Configuration.LazyLoadingEnabled = false;
Pemuatan malas dapat menutupi kode yang menyebabkan masalah performa. Misalnya, kode yang tidak menentukan pemuatan yang bersemangat atau eksplisit tetapi memproses volume entitas yang tinggi dan menggunakan beberapa properti navigasi di setiap perulangan mungkin sangat tidak efisien (karena banyak perjalanan pulang pergi ke database). Aplikasi yang berkinerja baik dalam pengembangan menggunakan server SQL lokal mungkin memiliki masalah performa ketika dipindahkan ke Azure SQL Database karena peningkatan latensi dan pemuatan malas. Membuat profil kueri database dengan beban pengujian realistis akan membantu Anda menentukan apakah pemuatan malas sesuai. Untuk informasi selengkapnya, lihat Mendemystifying Entity Framework Strategies: Memuat Data Terkait dan Menggunakan Kerangka Kerja Entitas untuk Mengurangi Latensi Jaringan ke SQL Azure.
Membuat Halaman Indeks Kursus yang Menampilkan Nama Departemen
Entitas Course mencakup properti navigasi yang berisi Department entitas departemen tempat kursus ditetapkan. Untuk menampilkan nama departemen yang ditetapkan dalam daftar kursus, Anda perlu mendapatkan Name properti dari Department entitas yang ada di Course.Department properti navigasi.
Buat pengontrol bernama CourseController untuk Course jenis entitas, menggunakan opsi yang sama dengan yang Anda lakukan sebelumnya untuk Student pengontrol, seperti yang ditunjukkan dalam ilustrasi berikut (kecuali tidak seperti gambar, kelas konteks Anda berada di namespace layanan DAL, bukan namespace layanan Model):
Buka Controllers\CourseController.cs dan lihat metode :Index
public ViewResult Index()
{
var courses = db.Courses.Include(c => c.Department);
return View(courses.ToList());
}
Perancah otomatis telah menentukan pemuatan bersemangat untuk Department properti navigasi dengan menggunakan Include metode .
Buka Views\Course\Index.cshtml dan ganti kode yang ada dengan kode berikut. Perubahan disorot:
@model IEnumerable<ContosoUniversity.Models.Course>
@{
ViewBag.Title = "Courses";
}
<h2>Courses</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th></th>
<th>Number</th>
<th>Title</th>
<th>Credits</th>
<th>Department</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.CourseID }) |
@Html.ActionLink("Details", "Details", new { id=item.CourseID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.CourseID })
</td>
<td>
@Html.DisplayFor(modelItem => item.CourseID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Credits)
</td>
<td>
@Html.DisplayFor(modelItem => item.Department.Name)
</td>
</tr>
}
</table>
Anda telah membuat perubahan berikut pada kode perancah:
- Mengubah judul dari Indeks ke Kursus.
- Memindahkan tautan baris ke kiri.
- Menambahkan kolom di bawah judul Nomor yang memperlihatkan
CourseIDnilai properti. (Secara default, kunci primer tidak di-scaffolding karena biasanya tidak berarti bagi pengguna akhir. Namun, dalam hal ini kunci primer bermakna dan Anda ingin menunjukkannya.) - Mengubah judul kolom terakhir dari DepartmentID (nama kunci asing menjadi
Departmententitas) menjadi Departemen.
Perhatikan bahwa untuk kolom terakhir, kode perancah menampilkan Name properti Department entitas yang dimuat ke Department dalam properti navigasi:
<td>
@Html.DisplayFor(modelItem => item.Department.Name)
</td>
Jalankan halaman (pilih tab Kursus di halaman beranda Universitas Contoso) untuk melihat daftar dengan nama departemen.
Membuat Halaman Indeks Instruktur yang Memperlihatkan Kursus dan Pendaftaran
Di bagian ini Anda akan membuat pengontrol dan menampilkan entitas Instructor untuk menampilkan halaman Indeks Instruktur:
Halaman ini membaca dan menampilkan data terkait dengan cara berikut:
- Daftar instruktur menampilkan data terkait dari
OfficeAssignmententitas. EntitasInstructordanOfficeAssignmentberada dalam hubungan satu-ke-nol-atau-satu. Anda akan menggunakan pemuatan bersemangat untukOfficeAssignmententitas. Seperti yang dijelaskan sebelumnya, pemuatan bersemangat biasanya lebih efisien ketika Anda memerlukan data terkait untuk semua baris tabel utama yang diambil. Dalam hal ini, Anda ingin menampilkan tugas kantor untuk semua instruktur yang ditampilkan. - Saat pengguna memilih instruktur, entitas terkait
Courseditampilkan. EntitasInstructordanCourseberada dalam hubungan banyak ke banyak. Anda akan menggunakan pemuatan bersemangat untukCourseentitas dan entitas terkaitnyaDepartment. Dalam hal ini, pemuatan malas mungkin lebih efisien karena Anda hanya memerlukan kursus untuk instruktur yang dipilih. Namun, contoh ini menunjukkan cara menggunakan pemuatan bersemangat untuk properti navigasi dalam entitas yang berada di properti navigasi. - Saat pengguna memilih kursus, data terkait dari
Enrollmentskumpulan entitas ditampilkan. EntitasCoursedanEnrollmentberada dalam hubungan satu-ke-banyak. Anda akan menambahkan pemuatan eksplisit untukEnrollmententitas dan entitas terkaitnyaStudent. (Pemuatan eksplisit tidak diperlukan karena pemuatan malas diaktifkan, tetapi ini menunjukkan cara melakukan pemuatan eksplisit.)
Membuat Model Tampilan untuk Tampilan Indeks Instruktur
Halaman Indeks Instruktur memperlihatkan tiga tabel berbeda. Oleh karena itu, Anda akan membuat model tampilan yang menyertakan tiga properti, masing-masing menyimpan data untuk salah satu tabel.
Di folder ViewModels , buat InstructorIndexData.cs dan ganti kode yang ada dengan kode berikut:
using System.Collections.Generic;
using ContosoUniversity.Models;
namespace ContosoUniversity.ViewModels
{
public class InstructorIndexData
{
public IEnumerable<Instructor> Instructors { get; set; }
public IEnumerable<Course> Courses { get; set; }
public IEnumerable<Enrollment> Enrollments { get; set; }
}
}
Menambahkan Gaya untuk Baris Terpilih
Untuk menandai baris terpilih, Anda memerlukan warna latar belakang yang berbeda. Untuk menyediakan gaya untuk UI ini, tambahkan kode yang disorot berikut ke bagian /* info and errors */ di Content\Site.css, seperti yang ditunjukkan di bawah ini:
/* info and errors */
.selectedrow
{
background-color: #a4d4e6;
}
.message-info {
border: 1px solid;
clear: both;
padding: 10px 20px;
}
Membuat Pengontrol dan Tampilan Instruktur
Buat pengontrol seperti yang InstructorController diperlihatkan dalam ilustrasi berikut:
Buka Controllers\InstructorController.cs dan tambahkan using pernyataan untuk ViewModels namespace:
using ContosoUniversity.ViewModels;
Kode perancah dalam Index metode menentukan pemuatan bersemangat hanya untuk OfficeAssignment properti navigasi:
public ViewResult Index()
{
var instructors = db.Instructors.Include(i => i.OfficeAssignment);
return View(instructors.ToList());
}
Index Ganti metode dengan kode berikut untuk memuat data terkait tambahan dan memasukkannya ke dalam model tampilan:
public ActionResult Index(int? id, int? courseID)
{
var viewModel = new InstructorIndexData();
viewModel.Instructors = db.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.Courses.Select(c => c.Department))
.OrderBy(i => i.LastName);
if (id != null)
{
ViewBag.InstructorID = id.Value;
viewModel.Courses = viewModel.Instructors.Where(
i => i.InstructorID == id.Value).Single().Courses;
}
if (courseID != null)
{
ViewBag.CourseID = courseID.Value;
viewModel.Enrollments = viewModel.Courses.Where(
x => x.CourseID == courseID).Single().Enrollments;
}
return View(viewModel);
}
Metode ini menerima data rute opsional (id) dan parameter string kueri (courseID) yang menyediakan nilai ID dari instruktur yang dipilih dan kursus yang dipilih, dan meneruskan semua data yang diperlukan ke tampilan. Parameter disediakan oleh Pilih hyperlink di halaman.
Tip
Merutekan data
Data rute adalah data yang ditemukan pengikat model di segmen URL yang ditentukan dalam tabel perutean. Misalnya, rute default menentukan controllersegmen , , actiondan id :
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Dalam URL berikut, rute default memetakan Instructor sebagai controller, Index sebagai action dan 1 sebagai id; ini adalah nilai data rute.
http://localhost:1230/Instructor/Index/1?courseID=2021
"?courseID=2021" adalah nilai string kueri. Pengikat model juga akan berfungsi jika Anda meneruskan id sebagai nilai string kueri:
http://localhost:1230/Instructor/Index?id=1&CourseID=2021
URL dibuat oleh ActionLink pernyataan dalam tampilan Razor. Dalam kode berikut, id parameter cocok dengan rute default, sehingga id ditambahkan ke data rute.
@Html.ActionLink("Select", "Index", new { id = item.PersonID })
Dalam kode berikut, courseID tidak cocok dengan parameter di rute default, sehingga ditambahkan sebagai string kueri.
@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })
Kode dimulai dengan membuat instans model tampilan dan memasukkannya ke dalam daftar instruktur. Kode menentukan pemuatan bersemangat untuk Instructor.OfficeAssignment properti navigasi dan Instructor.Courses .
var viewModel = new InstructorIndexData();
viewModel.Instructors = db.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.Courses.Select(c => c.Department))
.OrderBy(i => i.LastName);
Metode kedua Include memuat Kursus, dan untuk setiap Kursus yang dimuat, ia sangat ingin memuat untuk Course.Department properti navigasi.
.Include(i => i.Courses.Select(c => c.Department))
Seperti disebutkan sebelumnya, pemuatan bersemangat tidak diperlukan tetapi dilakukan untuk meningkatkan performa. Karena tampilan selalu memerlukan OfficeAssignment entitas, lebih efisien untuk mengambilnya dalam kueri yang sama.
Course entitas diperlukan ketika instruktur dipilih di halaman web, sehingga pemuatan yang bersemangat lebih baik daripada pemuatan malas hanya jika halaman ditampilkan lebih sering dengan kursus yang dipilih daripada tanpa.
Jika ID instruktur dipilih, instruktur yang dipilih diambil dari daftar instruktur dalam model tampilan. Properti model Courses tampilan kemudian dimuat dengan Course entitas dari properti navigasi instruktur tersebut Courses .
if (id != null)
{
ViewBag.InstructorID = id.Value;
viewModel.Courses = viewModel.Instructors.Where(i => i.InstructorID == id.Value).Single().Courses;
}
Metode mengembalikan Where koleksi, tetapi dalam hal ini kriteria yang diteruskan ke metode tersebut hanya menghasilkan satu Instructor entitas yang dikembalikan. Metode ini Single mengonversi koleksi menjadi satu Instructor entitas, yang memberi Anda akses ke properti entitas tersebut Courses .
Anda menggunakan metode Tunggal pada koleksi ketika Anda tahu koleksi hanya akan memiliki satu item. Metode Single ini memberikan pengecualian jika koleksi yang diteruskan ke sana kosong atau jika ada lebih dari satu item. Alternatifnya adalah SingleOrDefault, yang mengembalikan nilai default (null dalam hal ini) jika koleksi kosong. Namun, dalam hal ini yang masih akan menghasilkan pengecualian (dari mencoba menemukan Courses properti pada null referensi), dan pesan pengecualian akan kurang jelas menunjukkan penyebab masalah. Ketika Anda memanggil Single metode , Anda juga dapat meneruskan Where kondisi alih-alih memanggil Where metode secara terpisah:
.Single(i => i.InstructorID == id.Value)
Alih-alih:
.Where(I => i.InstructorID == id.Value).Single()
Selanjutnya, jika kursus dipilih, kursus yang dipilih diambil dari daftar kursus dalam model tampilan. Kemudian properti model Enrollments tampilan dimuat dengan Enrollment entitas dari properti navigasi kursus tersebut Enrollments .
if (courseID != null)
{
ViewBag.CourseID = courseID.Value;
viewModel.Enrollments = viewModel.Courses.Where(
x => x.CourseID == courseID).Single().Enrollments;
}
Memodifikasi Tampilan Indeks Instruktur
Di Views\Instructor\Index.cshtml, ganti kode yang ada dengan kode berikut. Perubahan disorot:
@model ContosoUniversity.ViewModels.InstructorIndexData
@{
ViewBag.Title = "Instructors";
}
<h2>Instructors</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th></th>
<th>Last Name</th>
<th>First Name</th>
<th>Hire Date</th>
<th>Office</th>
</tr>
@foreach (var item in Model.Instructors)
{
string selectedRow = "";
if (item.InstructorID == ViewBag.InstructorID)
{
selectedRow = "selectedrow";
}
<tr class="@selectedRow" valign="top">
<td>
@Html.ActionLink("Select", "Index", new { id = item.InstructorID }) |
@Html.ActionLink("Edit", "Edit", new { id = item.InstructorID }) |
@Html.ActionLink("Details", "Details", new { id = item.InstructorID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.InstructorID })
</td>
<td>
@item.LastName
</td>
<td>
@item.FirstMidName
</td>
<td>
@Html.DisplayFor(modelItem => item.HireDate)
</td>
<td>
@if (item.OfficeAssignment != null)
{
@item.OfficeAssignment.Location
}
</td>
</tr>
}
</table>
Anda telah membuat perubahan berikut pada kode yang ada:
Mengubah kelas model menjadi
InstructorIndexData.Mengubah judul halaman dari Indeks menjadi Instruktur.
Memindahkan kolom tautan baris ke kiri.
Menghapus kolom FullName .
Menambahkan kolom Office yang hanya ditampilkan
item.OfficeAssignment.Locationjikaitem.OfficeAssignmenttidak null. (Karena ini adalah hubungan satu-ke-nol-atau-satu, mungkin tidak ada entitas terkaitOfficeAssignment.)<td> @if (item.OfficeAssignment != null) { @item.OfficeAssignment.Location } </td>Menambahkan kode yang akan secara dinamis ditambahkan
class="selectedrow"ketrelemen instruktur yang dipilih. Ini mengatur warna latar belakang untuk baris yang dipilih menggunakan kelas CSS yang Anda buat sebelumnya. (Atributvalignakan berguna dalam tutorial berikut saat Anda menambahkan kolom multi-baris ke tabel.)string selectedRow = ""; if (item.InstructorID == ViewBag.InstructorID) { selectedRow = "selectedrow"; } <tr class="@selectedRow" valign="top">Menambahkan baru berlabel
ActionLinkPilih segera sebelum tautan lain di setiap baris, yang menyebabkan ID instruktur yang dipilih dikirim keIndexmetode .
Jalankan aplikasi dan pilih tab Instruktur . Halaman menampilkan Location properti entitas terkait OfficeAssignment dan sel tabel kosong saat tidak ada entitas terkait OfficeAssignment .
Dalam file Views\Instructor\Index.cshtml , setelah elemen penutup (di akhir file), tambahkan kode yang disorot table berikut. Ini menampilkan daftar kursus yang terkait dengan instruktur saat instruktur dipilih.
<td>
@if (item.OfficeAssignment != null)
{
@item.OfficeAssignment.Location
}
</td>
</tr>
}
</table>
@if (Model.Courses != null)
{
<h3>Courses Taught by Selected Instructor</h3>
<table>
<tr>
<th></th>
<th>ID</th>
<th>Title</th>
<th>Department</th>
</tr>
@foreach (var item in Model.Courses)
{
string selectedRow = "";
if (item.CourseID == ViewBag.CourseID)
{
selectedRow = "selectedrow";
}
<tr class="@selectedRow">
<td>
@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })
</td>
<td>
@item.CourseID
</td>
<td>
@item.Title
</td>
<td>
@item.Department.Name
</td>
</tr>
}
</table>
}
Kode ini membaca Courses properti model tampilan untuk menampilkan daftar kursus. Ini juga menyediakan Select hyperlink yang mengirim ID kursus yang dipilih ke Index metode tindakan.
Catatan
File .css di-cache oleh browser. Jika Anda tidak melihat perubahan saat menjalankan aplikasi, lakukan refresh keras (tahan tombol CTRL saat mengklik tombol Refresh , atau tekan CTRL+F5).
Jalankan halaman dan pilih instruktur. Sekarang Anda melihat kisi yang menampilkan kursus yang ditetapkan ke instruktur yang dipilih, dan untuk setiap kursus Anda melihat nama departemen yang ditetapkan.
Setelah blok kode yang baru saja Anda tambahkan, tambahkan kode berikut. Ini menampilkan daftar siswa yang terdaftar dalam kursus ketika kursus tersebut dipilih.
@if (Model.Enrollments != null)
{
<h3>
Students Enrolled in Selected Course</h3>
<table>
<tr>
<th>Name</th>
<th>Grade</th>
</tr>
@foreach (var item in Model.Enrollments)
{
<tr>
<td>
@item.Student.FullName
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade)
</td>
</tr>
}
</table>
}
Kode ini membaca Enrollments properti model tampilan untuk menampilkan daftar siswa yang terdaftar dalam kursus.
Jalankan halaman dan pilih instruktur. Kemudian pilih kursus untuk melihat daftar siswa terdaftar dan nilai mereka.
Menambahkan Pemuatan Eksplisit
Buka InstructorController.cs dan lihat bagaimana Index metode mendapatkan daftar pendaftaran untuk kursus yang dipilih:
if (courseID != null)
{
ViewBag.CourseID = courseID.Value;
viewModel.Enrollments = viewModel.Courses.Where(
x => x.CourseID == courseID).Single().Enrollments;
}
Ketika Anda mengambil daftar instruktur, Anda menentukan pemuatan bersemangat untuk Courses properti navigasi dan untuk Department properti dari setiap kursus. Kemudian Anda meletakkan Courses koleksi dalam model tampilan, dan sekarang Anda mengakses properti navigasi dari satu entitas dalam koleksi tersebut Enrollments . Karena Anda tidak menentukan pemuatan bersemangat untuk Course.Enrollments properti navigasi, data dari properti tersebut muncul di halaman sebagai akibat dari pemuatan malas.
Jika Anda menonaktifkan pemuatan malas tanpa mengubah kode dengan cara lain, Enrollments properti akan null terlepas dari berapa banyak pendaftaran yang sebenarnya dimiliki kursus. Dalam hal ini, untuk memuat Enrollments properti, Anda harus menentukan pemuatan yang sangat ingin atau pemuatan eksplisit. Anda telah melihat cara melakukan pemuatan yang bersemangat. Untuk melihat contoh pemuatan eksplisit, ganti Index metode dengan kode berikut, yang secara eksplisit memuat Enrollments properti . Kode yang diubah disorot.
public ActionResult Index(int? id, int? courseID)
{
var viewModel = new InstructorIndexData();
viewModel.Instructors = db.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.Courses.Select(c => c.Department))
.OrderBy(i => i.LastName);
if (id != null)
{
ViewBag.InstructorID = id.Value;
viewModel.Courses = viewModel.Instructors.Where(
i => i.InstructorID == id.Value).Single().Courses;
}
if (courseID != null)
{
ViewBag.CourseID = courseID.Value;
var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
foreach (Enrollment enrollment in selectedCourse.Enrollments)
{
db.Entry(enrollment).Reference(x => x.Student).Load();
}
viewModel.Enrollments = selectedCourse.Enrollments;
}
return View(viewModel);
}
Setelah mendapatkan entitas yang dipilih Course , kode baru secara eksplisit memuat properti navigasi kursus tersebut Enrollments :
db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
Kemudian secara eksplisit memuat entitas terkait Student setiap Enrollment entitas:
db.Entry(enrollment).Reference(x => x.Student).Load();
Perhatikan bahwa Anda menggunakan Collection metode untuk memuat properti koleksi, tetapi untuk properti yang hanya memiliki satu entitas, Anda menggunakan metode .Reference Anda dapat menjalankan halaman Indeks Instruktur sekarang dan Anda tidak akan melihat perbedaan apa yang ditampilkan di halaman, meskipun Anda telah mengubah cara data diambil.
Ringkasan
Anda sekarang telah menggunakan ketiga cara tersebut (malas, bersemangat, dan eksplisit) untuk memuat data terkait ke properti navigasi. Dalam tutorial berikutnya Anda akan mempelajari cara memperbarui data terkait.
Tautan ke sumber daya Kerangka Kerja Entitas lainnya dapat ditemukan di Peta Konten Akses Data ASP.NET.