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.
Dalam tutorial sebelumnya, Anda membuat aplikasi MVC yang menyimpan dan menampilkan data menggunakan Entity Framework (EF) 6 dan SQL Server LocalDB. Dalam tutorial ini, Anda meninjau dan menyesuaikan kode buat, baca, perbarui, hapus (CRUD) yang dibuat perancah MVC secara otomatis untuk Anda di pengontrol dan tampilan.
Catatan
Ini adalah praktik umum untuk menerapkan pola repositori untuk membuat lapisan abstraksi antara pengontrol Anda dan lapisan akses data. Untuk menjaga tutorial ini tetap sederhana dan berfokus pada pengajaran cara menggunakan EF 6 itu sendiri, mereka tidak menggunakan repositori. Untuk informasi tentang cara menerapkan repositori, lihat ASP.NET Peta Konten Akses Data.
Berikut adalah contoh halaman web yang Anda buat:



Di tutorial ini, Anda akan:
- Membuat halaman Detail
- Memperbarui halaman Buat
- Memperbarui metode HttpPost Edit
- Memperbarui halaman Hapus
- Menutup koneksi database
- Menangani transaksi
Prasyarat
Membuat halaman Detail
Kode perancah untuk halaman Siswa Index meninggalkan Enrollments properti, karena properti tersebut menyimpan koleksi. Details Di halaman, Anda akan menampilkan konten koleksi dalam tabel HTML.
Di Controllers\StudentController.cs, metode tindakan untuk Details tampilan menggunakan metode Temukan untuk mengambil satu Student entitas.
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
Nilai kunci diteruskan ke metode sebagai id parameter dan berasal dari data rute dalam hyperlink Detail di halaman Indeks.
Tips: Merutekan data
Data rute adalah data yang ditemukan oleh 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 dalam rute default, sehingga ditambahkan sebagai string kueri.
@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })
Untuk membuat halaman Detail
Buka Views\Student\Details.cshtml.
Setiap bidang ditampilkan menggunakan pembantu, seperti yang
DisplayFordiperlihatkan dalam contoh berikut:<dt> @Html.DisplayNameFor(model => model.LastName) </dt> <dd> @Html.DisplayFor(model => model.LastName) </dd>EnrollmentDateSetelah bidang dan segera sebelum tag penutup, tambahkan kode yang disorot</dl>untuk menampilkan daftar pendaftaran, seperti yang ditunjukkan dalam contoh berikut:<dt> @Html.DisplayNameFor(model => model.EnrollmentDate) </dt> <dd> @Html.DisplayFor(model => model.EnrollmentDate) </dd> <dt> @Html.DisplayNameFor(model => model.Enrollments) </dt> <dd> <table class="table"> <tr> <th>Course Title</th> <th>Grade</th> </tr> @foreach (var item in Model.Enrollments) { <tr> <td> @Html.DisplayFor(modelItem => item.Course.Title) </td> <td> @Html.DisplayFor(modelItem => item.Grade) </td> </tr> } </table> </dd> </dl> </div> <p> @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) | @Html.ActionLink("Back to List", "Index") </p>Jika indentasi kode salah setelah Anda menempelkan kode, tekan Ctrl+K, Ctrl+D untuk memformatnya.
Kode ini mengulangi entitas di
Enrollmentsproperti navigasi. Untuk setiapEnrollmententitas dalam properti, entitas menampilkan judul kursus dan nilainya. Judul kursus diambil dariCourseentitas yang disimpan diCoursepropertiEnrollmentsnavigasi entitas. Semua data ini diambil dari database secara otomatis saat diperlukan. Dengan kata lain, Anda menggunakan pemuatan malas di sini. Anda tidak menentukan pemuatan bersemangat untukCoursesproperti navigasi, sehingga pendaftaran tidak diambil dalam kueri yang sama yang mendapatkan siswa. Sebagai gantinya, pertama kali Anda mencoba mengaksesEnrollmentsproperti navigasi, kueri baru dikirim ke database untuk mengambil data. Anda dapat membaca lebih lanjut tentang pemuatan malas dan pemuatan yang bersemangat dalam tutorial Membaca Data Terkait nanti dalam seri ini.Buka halaman Detail dengan memulai program (Ctrl+F5), memilih tab Siswa , lalu klik tautan Detail untuk Alexander Carson. (Jika Anda menekan Ctrl+F5 saat file Details.cshtml terbuka, Anda mendapatkan kesalahan HTTP 400. Ini karena Visual Studio mencoba menjalankan halaman Detail, tetapi tidak tercapai dari tautan yang menentukan siswa yang akan ditampilkan. Jika itu terjadi, hapus "Siswa/Detail" dari URL dan coba lagi, atau, tutup browser, klik kanan proyek, dan klik Lihat>Tampilan di Browser.)
Anda melihat daftar kursus dan nilai untuk siswa yang dipilih.
Tutup browser.
Memperbarui halaman Buat
Di Controllers\StudentController.cs, ganti HttpPostAttribute
Createmetode tindakan dengan kode berikut. Kode ini menambahkantry-catchblok dan menghapusIDdari BindAttribute atribut untuk metode perancah:[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student) { try { if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); } } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator."); } return View(student); }Kode ini menambahkan entitas yang
Studentdibuat oleh pengikat model MVC ASP.NET keStudentskumpulan entitas lalu menyimpan perubahan ke database. Pengikat model mengacu pada fungsionalitas MVC ASP.NET yang memudahkan Anda untuk bekerja dengan data yang dikirimkan oleh formulir; pengikat model mengonversi nilai formulir yang diposting ke jenis CLR dan meneruskannya ke metode tindakan dalam parameter. Dalam hal ini, pengikat model membuat instansStudententitas untuk Anda menggunakan nilai properti dariFormkoleksi.Anda menghapus
IDdari atribut Bind karenaIDadalah nilai kunci utama yang akan diatur SQL Server secara otomatis saat baris disisipkan. Input dari pengguna tidak mengaturIDnilai.Peringatan keamanan - Atribut
ValidateAntiForgeryTokenmembantu mencegah serangan pemalsuan permintaan lintas situs. Ini memerlukan pernyataan yangHtml.AntiForgeryToken()sesuai dalam tampilan, yang akan Anda lihat nanti.Atribut
Bindadalah salah satu cara untuk melindungi dari posting berlebihan dalam membuat skenario. Misalnya,Studententitas menyertakanSecretproperti yang tidak ingin Anda atur halaman web ini.public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public string Secret { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }Bahkan jika Anda tidak memiliki
Secretbidang di halaman web, peretas dapat menggunakan alat seperti fiddler, atau menulis beberapa JavaScript, untuk mempostingSecretnilai formulir. BindAttribute Tanpa atribut yang membatasi bidang yang digunakan pengikat model saat membuat instansStudent, pengikat model akan mengambilSecretnilai formulir tersebutStudentdan menggunakannya untuk membuat instans entitas. Kemudian nilai apa pun yang ditentukan peretas untukSecretbidang formulir akan diperbarui dalam database Anda. Gambar berikut menunjukkan alat fiddler yang menambahkanSecretbidang (dengan nilai "OverPost") ke nilai formulir yang diposting.
Nilai "OverPost" kemudian akan berhasil ditambahkan ke
Secretproperti baris yang disisipkan, meskipun Anda tidak pernah bermaksud agar halaman web dapat mengatur properti tersebut.Yang terbaik adalah menggunakan
Includeparameter denganBindatribut untuk secara eksplisit mencantumkan bidang. DimungkinkanExcludejuga untuk menggunakan parameter untuk memblokir bidang yang ingin Anda kecualikan. AlasannyaIncludelebih aman adalah ketika Anda menambahkan properti baru ke entitas, bidang baru tidak secara otomatis dilindungi olehExcludedaftar.Anda dapat mencegah overposting dalam skenario edit adalah dengan membaca entitas dari database terlebih dahulu lalu memanggil
TryUpdateModel, meneruskan daftar properti eksplisit yang diizinkan. Itulah metode yang digunakan dalam tutorial ini.Cara alternatif untuk mencegah overposting yang lebih disukai oleh banyak pengembang adalah dengan menggunakan model tampilan daripada kelas entitas dengan pengikatan model. Sertakan hanya properti yang ingin Anda perbarui dalam model tampilan. Setelah pengikat model MVC selesai, salin properti model tampilan ke instans entitas, secara opsional menggunakan alat seperti AutoMapper. Gunakan db. Entri pada instans entitas untuk mengatur statusnya ke Tidak Berubah, lalu atur Properti("PropertyName"). Dimodifikasi ke true pada setiap properti entitas yang disertakan dalam model tampilan. Metode ini berfungsi dalam skenario edit dan buat.
BindSelain atribut ,try-catchblok adalah satu-satunya perubahan yang Telah Anda lakukan pada kode perancah. Jika pengecualian yang berasal dari DataException tertangkap saat perubahan sedang disimpan, pesan kesalahan umum ditampilkan. DataException pengecualian terkadang disebabkan oleh sesuatu di luar aplikasi daripada kesalahan pemrograman, sehingga pengguna disarankan untuk mencoba lagi. Meskipun tidak diimplementasikan dalam sampel ini, aplikasi kualitas produksi akan mencatat pengecualian. Untuk informasi selengkapnya, lihat bagian Log untuk wawasan di Pemantauan dan Telemetri (Membangun Aplikasi Cloud Dunia Nyata dengan Azure).Kode dalam Views\Student\Create.cshtml mirip dengan apa yang Anda lihat di Details.cshtml, kecuali bahwa
EditorFordanValidationMessageForpembantu digunakan untuk setiap bidang alih-alihDisplayFor. Berikut adalah kode yang relevan:<div class="form-group"> @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName) </div> </div>Create.cshtml juga menyertakan
@Html.AntiForgeryToken(), yang berfungsi denganValidateAntiForgeryTokenatribut di pengontrol untuk membantu mencegah serangan pemalsuan permintaan lintas situs.Tidak ada perubahan yang diperlukan di Create.cshtml.
Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Buat Baru.
Masukkan nama dan tanggal yang tidak valid dan klik Buat untuk melihat pesan kesalahan.
Ini adalah validasi sisi server yang Anda dapatkan secara default. Dalam tutorial selanjutnya, Anda akan melihat cara menambahkan atribut yang menghasilkan kode untuk validasi sisi klien. Kode yang disorot berikut menunjukkan pemeriksaan validasi model dalam metode Buat .
if (ModelState.IsValid) { db.Students.Add(student); db.SaveChanges(); return RedirectToAction("Index"); }Ubah tanggal menjadi nilai yang valid dan klik Buat untuk melihat siswa baru muncul di halaman Indeks .
Tutup browser.
Perbarui metode Edit HttpPost
HttpPostAttribute
EditGanti metode tindakan dengan kode berikut:[HttpPost, ActionName("Edit")] [ValidateAntiForgeryToken] public ActionResult EditPost(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var studentToUpdate = db.Students.Find(id); if (TryUpdateModel(studentToUpdate, "", new string[] { "LastName", "FirstMidName", "EnrollmentDate" })) { try { db.SaveChanges(); return RedirectToAction("Index"); } catch (DataException /* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); } } return View(studentToUpdate); }Catatan
Di Controllers\StudentController.cs,
HttpGet Editmetode (yang tanpaHttpPostatribut) menggunakanFindmetode untuk mengambil entitas yang dipilih, seperti yangStudentAnda lihat dalamDetailsmetode . Anda tidak perlu mengubah metode ini.Perubahan ini menerapkan praktik terbaik keamanan untuk mencegah overposting, Perancah menghasilkan atribut dan menambahkan entitas yang
Binddibuat oleh pengikat model ke entitas yang ditetapkan dengan bendera Diubah. Kode tersebut tidak lagi direkomendasikan karenaBindatribut menghapus data yang sudah ada sebelumnya di bidang yang tidak tercantum dalamIncludeparameter. Di masa mendatang, perancah pengontrol MVC akan diperbarui sehingga tidak menghasilkanBindatribut untuk metode Edit.Kode baru membaca entitas dan panggilan TryUpdateModel yang ada untuk memperbarui bidang dari input pengguna dalam data formulir yang diposting. Pelacakan perubahan otomatis Entity Framework mengatur bendera EntityState.Modified pada entitas. Ketika metode SaveChanges dipanggil, Modified bendera menyebabkan Kerangka Kerja Entitas membuat pernyataan SQL untuk memperbarui baris database. Konflik konkurensi diabaikan, dan semua kolom baris database diperbarui, termasuk yang tidak diubah pengguna. (Tutorial selanjutnya menunjukkan cara menangani konflik konkurensi, dan jika Anda hanya ingin bidang individual diperbarui dalam database, Anda dapat mengatur entitas ke EntityState.Unchanged dan atur bidang individual ke EntityState.Modified.)
Untuk mencegah overposting, bidang yang ingin Anda perbarui oleh halaman Edit tercantum dalam
TryUpdateModelparameter. Saat ini tidak ada bidang tambahan yang Anda lindungi, tetapi mencantumkan bidang yang Anda inginkan agar pengikat pengikat model memastikan bahwa jika Anda menambahkan bidang ke model data di masa mendatang, bidang tersebut secara otomatis dilindungi hingga Anda secara eksplisit menambahkannya di sini.Akibat perubahan ini, tanda tangan metode metode HttpPost Edit sama dengan metode edit HttpGet; oleh karena itu Anda telah mengganti nama metode EditPost.
Tip
Status Entitas dan Metode Lampirkan dan SaveChanges
Konteks database melacak apakah entitas dalam memori sinkron dengan baris yang sesuai dalam database, dan informasi ini menentukan apa yang terjadi saat Anda memanggil
SaveChangesmetode . Misalnya, saat Anda meneruskan entitas baru ke metode Tambahkan , status entitas tersebut diatur keAdded. Kemudian saat Anda memanggil metode SaveChanges , konteks database mengeluarkan perintah SQLINSERT.Entitas mungkin berada di salah satu status berikut:
Added. Entitas belum ada di database. MetodeSaveChangesharus mengeluarkanINSERTpernyataan.Unchanged. Tidak ada yang perlu dilakukan dengan entitas ini denganSaveChangesmetode . Saat Anda membaca entitas dari database, entitas dimulai dengan status ini.Modified. Beberapa atau semua nilai properti entitas telah dimodifikasi. MetodeSaveChangesharus mengeluarkanUPDATEpernyataan.Deleted. Entitas telah ditandai untuk dihapus. MetodeSaveChangesharus mengeluarkanDELETEpernyataan.Detached. Entitas tidak dilacak oleh konteks database.
Dalam aplikasi desktop, perubahan status biasanya diatur secara otomatis. Dalam jenis aplikasi desktop, Anda membaca entitas dan membuat perubahan pada beberapa nilai propertinya. Ini menyebabkan status entitasnya secara otomatis diubah menjadi
Modified. Kemudian saat Anda memanggilSaveChanges, Kerangka Kerja Entitas menghasilkan pernyataan SQLUPDATEyang hanya memperbarui properti aktual yang Anda ubah.Sifat aplikasi web yang terputus tidak memungkinkan urutan berkelanjutan ini. DbContext yang membaca entitas dibuang setelah halaman dirender.
HttpPostEditKetika metode tindakan dipanggil, permintaan baru dibuat dan Anda memiliki instans baru DbContext, jadi Anda harus mengatur status entitas secara manual keModified.Kemudian ketika Anda memanggilSaveChanges, Kerangka Kerja Entitas memperbarui semua kolom baris database, karena konteks tidak memiliki cara untuk mengetahui properti mana yang Anda ubah.Jika Anda ingin pernyataan SQL
Updatehanya memperbarui bidang yang benar-benar diubah pengguna, Anda dapat menyimpan nilai asli dalam beberapa cara (seperti bidang tersembunyi) sehingga tersedia saatHttpPostEditmetode dipanggil. Kemudian Anda dapat membuatStudententitas menggunakan nilai asli, memanggilAttachmetode dengan versi asli entitas tersebut, memperbarui nilai entitas ke nilai baru, lalu memanggilSaveChanges.Untuk informasi selengkapnya, lihat Status entitas dan SaveChanges dan Data Lokal.Kode HTML dan Razor di Views\Student\Edit.cshtml mirip dengan apa yang Anda lihat di Create.cshtml, dan tidak ada perubahan yang diperlukan.
Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Edit hyperlink.
Ubah beberapa data dan klik Simpan. Anda melihat data yang diubah di halaman Indeks.
Tutup browser.
Memperbarui halaman Hapus
Di Controllers\StudentController.cs, kode templat untuk HttpGetAttribute Delete metode menggunakan Find metode untuk mengambil entitas yang dipilih, seperti yang Student Anda lihat dalam Details metode dan Edit . Namun, untuk menerapkan pesan kesalahan kustom saat panggilan gagal SaveChanges , Anda akan menambahkan beberapa fungsionalitas ke metode ini dan tampilan yang sesuai.
Seperti yang Anda lihat untuk memperbarui dan membuat operasi, operasi penghapusan memerlukan dua metode tindakan. Metode yang dipanggil sebagai respons terhadap permintaan GET menampilkan tampilan yang memberi pengguna kesempatan untuk menyetujui atau membatalkan operasi penghapusan. Jika pengguna menyetujuinya, permintaan POST dibuat. Ketika itu terjadi, metode dipanggil HttpPost Delete dan kemudian metode itu benar-benar melakukan operasi penghapusan.
Anda akan menambahkan try-catch blok ke HttpPostAttribute Delete metode untuk menangani kesalahan apa pun yang mungkin terjadi saat database diperbarui. Jika terjadi kesalahan, HttpPostAttribute Delete metode memanggil HttpGetAttribute Delete metode , meneruskannya parameter yang menunjukkan bahwa kesalahan telah terjadi. Metode kemudian HttpGetAttribute Delete memutar ulang halaman konfirmasi bersama dengan pesan kesalahan, memberi pengguna kesempatan untuk membatalkan atau mencoba lagi.
HttpGetAttribute
DeleteGanti metode tindakan dengan kode berikut, yang mengelola pelaporan kesalahan:public ActionResult Delete(int? id, bool? saveChangesError=false) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } if (saveChangesError.GetValueOrDefault()) { ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator."; } Student student = db.Students.Find(id); if (student == null) { return HttpNotFound(); } return View(student); }Kode ini menerima parameter opsional yang menunjukkan apakah metode dipanggil setelah kegagalan untuk menyimpan perubahan. Parameter ini adalah
falseketika metode dipanggilHttpGetDeletetanpa kegagalan sebelumnya. Ketika dipanggil olehHttpPostDeletemetode sebagai respons terhadap kesalahan pembaruan database, parameternya adalahtruedan pesan kesalahan diteruskan ke tampilan.HttpPostAttribute
DeleteGanti metode tindakan (bernamaDeleteConfirmed) dengan kode berikut, yang melakukan operasi penghapusan aktual dan menangkap kesalahan pembaruan database apa pun.[HttpPost] [ValidateAntiForgeryToken] public ActionResult Delete(int id) { try { Student student = db.Students.Find(id); db.Students.Remove(student); db.SaveChanges(); } catch (DataException/* dex */) { //Log the error (uncomment dex variable name and add a line here to write a log. return RedirectToAction("Delete", new { id = id, saveChangesError = true }); } return RedirectToAction("Index"); }Kode ini mengambil entitas yang dipilih, lalu memanggil metode Hapus untuk mengatur status entitas ke
Deleted. KetikaSaveChangesdipanggil, perintah SQLDELETEdihasilkan. Anda juga telah mengubah nama metode tindakan dariDeleteConfirmedmenjadiDelete. Kode perancah bernamaHttpPostDeletemetodeDeleteConfirmeduntuk memberikanHttpPostmetode tanda tangan unik. (CLR memerlukan metode kelebihan beban untuk memiliki parameter metode yang berbeda.) Sekarang setelah tanda tangan unik, Anda dapat tetap dengan konvensi MVC dan menggunakan nama yang sama untukHttpPostmetode danHttpGethapus.Jika meningkatkan performa dalam aplikasi volume tinggi adalah prioritas, Anda dapat menghindari kueri SQL yang tidak perlu untuk mengambil baris dengan mengganti baris kode yang memanggil
Findmetode danRemovedengan kode berikut:Student studentToDelete = new Student() { ID = id }; db.Entry(studentToDelete).State = EntityState.Deleted;Kode ini membuat
Studentinstans entitas hanya menggunakan nilai kunci utama lalu mengatur status entitas keDeleted. Itu saja yang dibutuhkan Entity Framework untuk menghapus entitas.Seperti yang disebutkan,
HttpGetDeletemetode tidak menghapus data. Melakukan operasi penghapusan sebagai respons terhadap permintaan GET (atau untuk hal itu, melakukan operasi edit apa pun, membuat operasi, atau operasi lain yang mengubah data) membuat risiko keamanan.Di Views\Student\Delete.cshtml, tambahkan pesan kesalahan antara
h2judul danh3judul, seperti yang ditunjukkan dalam contoh berikut:<h2>Delete</h2> <p class="error">@ViewBag.ErrorMessage</p> <h3>Are you sure you want to delete this?</h3>Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Hapus hyperlink.
Pilih Hapus pada halaman yang berbuli Apakah Anda yakin ingin menghapus ini?.
Halaman Indeks ditampilkan tanpa siswa yang dihapus. (Anda akan melihat contoh kode penanganan kesalahan dalam tindakan dalam tutorial konkurensi.)
Menutup koneksi database
Untuk menutup koneksi database dan membebaskan sumber daya yang mereka pegang sesegera mungkin, buang instans konteks ketika Anda selesai dengannya. Itulah sebabnya kode perancah menyediakan metode Buang di akhir StudentController kelas di StudentController.cs, seperti yang ditunjukkan dalam contoh berikut:
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
Kelas dasar Controller sudah mengimplementasikan IDisposable antarmuka, sehingga kode ini hanya menambahkan penimpaan ke Dispose(bool) metode untuk secara eksplisit membuang instans konteks.
Menangani transaksi
Secara default, Entity Framework secara implisit mengimplementasikan transaksi. Dalam skenario di mana Anda membuat perubahan pada beberapa baris atau tabel lalu memanggil SaveChanges, Kerangka Kerja Entitas secara otomatis memastikan bahwa semua perubahan Anda berhasil atau semua gagal. Jika beberapa perubahan dilakukan terlebih dahulu dan kemudian terjadi kesalahan, perubahan tersebut secara otomatis digulung balik. Untuk skenario di mana Anda memerlukan lebih banyak kontrol—misalnya, jika Anda ingin menyertakan operasi yang dilakukan di luar Kerangka Kerja Entitas dalam transaksi—lihat Bekerja dengan Transaksi.
Mendapatkan kode
Sumber Daya Tambahan:
Anda sekarang memiliki sekumpulan halaman lengkap yang melakukan operasi CRUD sederhana untuk Student entitas. Anda menggunakan pembantu MVC untuk menghasilkan elemen UI untuk bidang data. Untuk informasi selengkapnya tentang pembantu MVC, lihat Merender Formulir Menggunakan Pembantu HTML (artikelnya adalah untuk MVC 3 tetapi masih relevan untuk MVC 5).
Tautan ke sumber daya EF 6 lainnya dapat ditemukan di ASP.NET Akses Data - Sumber Daya yang Direkomendasikan.
Langkah berikutnya
Di tutorial ini, Anda akan:
- Membuat halaman Detail
- Memperbarui halaman Buat
- Memperbarui metode HttpPost Edit
- Memperbarui halaman Hapus
- Koneksi database tertutup
- Transaksi yang ditangani
Lanjutkan ke artikel berikutnya untuk mempelajari cara menambahkan pengurutan, pemfilteran, dan penomoran halaman ke proyek.