Bagikan melalui


Tutorial: Menerapkan Fungsionalitas CRUD dengan Kerangka Kerja Entitas di ASP.NET MVC

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:

Cuplikan layar halaman detail siswa.

Cuplikan layar halaman buat siswa.

Cuplikan layar ot halaman penghapusan siswa.

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

  1. Buka Views\Student\Details.cshtml.

    Setiap bidang ditampilkan menggunakan pembantu, seperti yang DisplayFor diperlihatkan dalam contoh berikut:

    <dt>
        @Html.DisplayNameFor(model => model.LastName)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.LastName)
    </dd>
    
  2. EnrollmentDate Setelah 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 Enrollments properti navigasi. Untuk setiap Enrollment entitas dalam properti, entitas menampilkan judul kursus dan nilainya. Judul kursus diambil dari Course entitas yang disimpan di Course properti Enrollments navigasi 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 untuk Courses properti navigasi, sehingga pendaftaran tidak diambil dalam kueri yang sama yang mendapatkan siswa. Sebagai gantinya, pertama kali Anda mencoba mengakses Enrollments properti 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.

  3. 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.

  4. Tutup browser.

Memperbarui halaman Buat

  1. Di Controllers\StudentController.cs, ganti HttpPostAttribute Create metode tindakan dengan kode berikut. Kode ini menambahkan try-catch blok dan menghapus ID dari 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 Student dibuat oleh pengikat model MVC ASP.NET ke Students kumpulan 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 instans Student entitas untuk Anda menggunakan nilai properti dari Form koleksi.

    Anda menghapus ID dari atribut Bind karena ID adalah nilai kunci utama yang akan diatur SQL Server secara otomatis saat baris disisipkan. Input dari pengguna tidak mengatur ID nilai.

    Peringatan keamanan - Atribut ValidateAntiForgeryToken membantu mencegah serangan pemalsuan permintaan lintas situs. Ini memerlukan pernyataan yang Html.AntiForgeryToken() sesuai dalam tampilan, yang akan Anda lihat nanti.

    Atribut Bind adalah salah satu cara untuk melindungi dari posting berlebihan dalam membuat skenario. Misalnya, Student entitas menyertakan Secret properti 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 Secret bidang di halaman web, peretas dapat menggunakan alat seperti fiddler, atau menulis beberapa JavaScript, untuk memposting Secret nilai formulir. BindAttribute Tanpa atribut yang membatasi bidang yang digunakan pengikat model saat membuat instansStudent, pengikat model akan mengambil Secret nilai formulir tersebut Student dan menggunakannya untuk membuat instans entitas. Kemudian nilai apa pun yang ditentukan peretas untuk Secret bidang formulir akan diperbarui dalam database Anda. Gambar berikut menunjukkan alat fiddler yang menambahkan Secret bidang (dengan nilai "OverPost") ke nilai formulir yang diposting.

    Cuplikan layar yang memperlihatkan tab Composer. Di sudut kanan atas, Jalankan dilingkari dengan warna merah. Di sudut kanan bawah, Rahasia sama dengan Di Atas Postingan dilingkari dengan warna merah.

    Nilai "OverPost" kemudian akan berhasil ditambahkan ke Secret properti baris yang disisipkan, meskipun Anda tidak pernah bermaksud agar halaman web dapat mengatur properti tersebut.

    Yang terbaik adalah menggunakan Include parameter dengan Bind atribut untuk secara eksplisit mencantumkan bidang. Dimungkinkan Exclude juga untuk menggunakan parameter untuk memblokir bidang yang ingin Anda kecualikan. Alasannya Include lebih aman adalah ketika Anda menambahkan properti baru ke entitas, bidang baru tidak secara otomatis dilindungi oleh Exclude daftar.

    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.

    Bind Selain atribut , try-catch blok 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 EditorFor dan ValidationMessageFor pembantu digunakan untuk setiap bidang alih-alih DisplayFor. 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 dengan ValidateAntiForgeryToken atribut di pengontrol untuk membantu mencegah serangan pemalsuan permintaan lintas situs.

    Tidak ada perubahan yang diperlukan di Create.cshtml.

  2. Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Buat Baru.

  3. 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");
    }
    
  4. Ubah tanggal menjadi nilai yang valid dan klik Buat untuk melihat siswa baru muncul di halaman Indeks .

  5. Tutup browser.

Perbarui metode Edit HttpPost

  1. HttpPostAttribute Edit Ganti 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 Edit metode (yang tanpa HttpPost atribut) menggunakan Find metode untuk mengambil entitas yang dipilih, seperti yang Student Anda lihat dalam Details metode . Anda tidak perlu mengubah metode ini.

    Perubahan ini menerapkan praktik terbaik keamanan untuk mencegah overposting, Perancah menghasilkan atribut dan menambahkan entitas yang Bind dibuat oleh pengikat model ke entitas yang ditetapkan dengan bendera Diubah. Kode tersebut tidak lagi direkomendasikan karena Bind atribut menghapus data yang sudah ada sebelumnya di bidang yang tidak tercantum dalam Include parameter. Di masa mendatang, perancah pengontrol MVC akan diperbarui sehingga tidak menghasilkan Bind atribut 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 TryUpdateModel parameter. 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 SaveChanges metode . Misalnya, saat Anda meneruskan entitas baru ke metode Tambahkan , status entitas tersebut diatur ke Added. Kemudian saat Anda memanggil metode SaveChanges , konteks database mengeluarkan perintah SQL INSERT .

    Entitas mungkin berada di salah satu status berikut:

    • Added. Entitas belum ada di database. Metode SaveChanges harus mengeluarkan INSERT pernyataan.
    • Unchanged. Tidak ada yang perlu dilakukan dengan entitas ini dengan SaveChanges metode . Saat Anda membaca entitas dari database, entitas dimulai dengan status ini.
    • Modified. Beberapa atau semua nilai properti entitas telah dimodifikasi. Metode SaveChanges harus mengeluarkan UPDATE pernyataan.
    • Deleted. Entitas telah ditandai untuk dihapus. Metode SaveChanges harus mengeluarkan DELETE pernyataan.
    • 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 memanggil SaveChanges, Kerangka Kerja Entitas menghasilkan pernyataan SQL UPDATE yang 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. HttpPost Edit Ketika metode tindakan dipanggil, permintaan baru dibuat dan Anda memiliki instans baru DbContext, jadi Anda harus mengatur status entitas secara manual ke Modified. Kemudian ketika Anda memanggil SaveChanges, 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 Update hanya memperbarui bidang yang benar-benar diubah pengguna, Anda dapat menyimpan nilai asli dalam beberapa cara (seperti bidang tersembunyi) sehingga tersedia saat HttpPost Edit metode dipanggil. Kemudian Anda dapat membuat Student entitas menggunakan nilai asli, memanggil Attach metode dengan versi asli entitas tersebut, memperbarui nilai entitas ke nilai baru, lalu memanggil SaveChanges. 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.

  2. Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Edit hyperlink.

  3. Ubah beberapa data dan klik Simpan. Anda melihat data yang diubah di halaman Indeks.

  4. 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.

  1. HttpGetAttribute Delete Ganti 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 false ketika metode dipanggil HttpGet Delete tanpa kegagalan sebelumnya. Ketika dipanggil oleh HttpPost Delete metode sebagai respons terhadap kesalahan pembaruan database, parameternya adalah true dan pesan kesalahan diteruskan ke tampilan.

  2. HttpPostAttribute Delete Ganti metode tindakan (bernama DeleteConfirmed) 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. Ketika SaveChanges dipanggil, perintah SQL DELETE dihasilkan. Anda juga telah mengubah nama metode tindakan dari DeleteConfirmed menjadi Delete. Kode perancah bernama HttpPost Delete metode DeleteConfirmed untuk memberikan HttpPost metode 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 untuk HttpPost metode dan HttpGet hapus.

    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 Find metode dan Remove dengan kode berikut:

    Student studentToDelete = new Student() { ID = id };
    db.Entry(studentToDelete).State = EntityState.Deleted;
    

    Kode ini membuat Student instans entitas hanya menggunakan nilai kunci utama lalu mengatur status entitas ke Deleted. Itu saja yang dibutuhkan Entity Framework untuk menghapus entitas.

    Seperti yang disebutkan, HttpGet Delete metode 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.

  3. Di Views\Student\Delete.cshtml, tambahkan pesan kesalahan antara h2 judul dan h3 judul, 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>
    
  4. Jalankan halaman dengan memulai program, pilih tab Siswa , lalu klik Hapus hyperlink.

  5. 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

Unduh Proyek Yang Selesai

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.