Bagikan melalui


Membuat Kelas Model dengan Kerangka Kerja Entitas (C#)

oleh Microsoft

Dalam tutorial ini, Anda mempelajari cara menggunakan ASP.NET MVC dengan Microsoft Entity Framework. Anda mempelajari cara menggunakan Wizard Entitas untuk membuat Model Data Entitas ADO.NET. Selama tutorial ini, kami membangun aplikasi web yang menggambarkan cara memilih, menyisipkan, memperbarui, dan menghapus data database dengan menggunakan Kerangka Kerja Entitas.

Tujuan tutorial ini adalah untuk menjelaskan bagaimana Anda dapat membuat kelas akses data menggunakan Microsoft Entity Framework saat membangun aplikasi MVC ASP.NET. Tutorial ini mengasumsikan tidak ada pengetahuan sebelumnya tentang Microsoft Entity Framework. Pada akhir tutorial ini, Anda akan memahami cara menggunakan Kerangka Kerja Entitas untuk memilih, menyisipkan, memperbarui, dan menghapus rekaman database.

Microsoft Entity Framework adalah alat Pemetaan Hubungan Objek (O/RM) yang memungkinkan Anda membuat lapisan akses data dari database secara otomatis. Kerangka Kerja Entitas memungkinkan Anda menghindari pekerjaan yang membosankan dalam membangun kelas akses data Anda secara manual.

Untuk mengilustrasikan bagaimana Anda dapat menggunakan Microsoft Entity Framework dengan ASP.NET MVC, kami akan membuat aplikasi sampel sederhana. Kami akan membuat aplikasi Database Film yang memungkinkan Anda menampilkan dan mengedit rekaman database film.

Tutorial ini mengasumsikan bahwa Anda memiliki Visual Studio 2008 atau Visual Web Developer 2008 dengan Paket Layanan 1. Anda memerlukan Paket Layanan 1 untuk menggunakan Kerangka Kerja Entitas. Anda dapat mengunduh Visual Studio 2008 Service Pack 1 atau Visual Web Developer dengan Paket Layanan 1 dari alamat berikut:

https://www.asp.net/downloads/

Catatan

Tidak ada koneksi penting antara ASP.NET MVC dan Microsoft Entity Framework. Ada beberapa alternatif untuk Kerangka Kerja Entitas yang dapat Anda gunakan dengan ASP.NET MVC. Misalnya, Anda dapat membuat kelas Model MVC menggunakan alat O/RM lainnya seperti Microsoft LINQ ke SQL, NHibernate, atau SubSonic.

Membuat Database Sampel Film

Aplikasi Database Film menggunakan tabel database bernama Film yang berisi kolom berikut:

Nama kolom Jenis Data Perbolehkan Nulls? Apakah Kunci Primer?
Id int Salah True
Judul nvarchar(100) FALSE FALSE
direktur nvarchar(100) FALSE FALSE

Anda bisa menambahkan tabel ini ke proyek MVC ASP.NET dengan mengikuti langkah-langkah berikut:

  1. Klik kanan folder App_Data di jendela Penjelajah Solusi dan pilih opsi menu Tambahkan, Item Baru.
  2. Dari kotak dialog Tambahkan Item Baru, pilih SQL Server Database, beri database nama MoviesDB.mdf, dan klik tombol Tambahkan.
  3. Klik dua kali file MoviesDB.mdf untuk membuka jendela Server Explorer/Database Explorer.
  4. Perluas koneksi database MoviesDB.mdf, klik kanan folder Tabel, dan pilih opsi menu Tambahkan Tabel Baru.
  5. Di Designer Tabel, tambahkan kolom Id, Judul, dan Direktur.
  6. Klik tombol Simpan (memiliki ikon floppy) untuk menyimpan tabel baru dengan nama Film.

Setelah Anda membuat tabel database Film, Anda harus menambahkan beberapa data sampel ke tabel. Klik kanan tabel Film dan pilih opsi menu Perlihatkan Data Tabel. Anda dapat memasukkan data film palsu ke dalam kisi yang muncul.

Membuat Model Data Entitas ADO.NET

Untuk menggunakan Kerangka Kerja Entitas, Anda perlu membuat Model Data Entitas. Anda dapat memanfaatkan Wizard Model Data Entitas Visual Studio untuk menghasilkan Model Data Entitas dari database secara otomatis.

Ikuti langkah-langkah berikut:

  1. Klik kanan folder Model di jendela Penjelajah Solusi dan pilih opsi menu Tambahkan, Item Baru.
  2. Dalam dialog Tambahkan Item Baru , pilih Kategori data (lihat Gambar 1).
  3. Pilih templat ADO.NET Entity Data Model , beri nama Model Data Entitas MoviesDBModel.edmx, dan klik tombol Tambahkan . Mengklik tombol Tambahkan meluncurkan Wizard Model Data.
  4. Di langkah Pilih Konten Model , pilih opsi Hasilkan dari database dan klik tombol Berikutnya (lihat Gambar 2).
  5. Di langkah Pilih Koneksi Data Anda , pilih koneksi database MoviesDB.mdf, masukkan nama pengaturan koneksi entitas MoviesDBEntities, dan klik tombol Berikutnya (lihat Gambar 3).
  6. Di langkah Pilih Objek Database Anda , pilih tabel Database film dan klik tombol Selesai (lihat Gambar 4).

Setelah Anda menyelesaikan langkah-langkah ini, ADO.NET Entity Data Model Designer (Entity Designer) terbuka.

Gambar 1 – Membuat Model Data Entitas baru

clip_image002

Gambar 2 – Pilih Langkah Konten Model

clip_image004

Gambar 3 – Pilih Koneksi Data Anda

clip_image006

Gambar 4 – Pilih Objek Database Anda

clip_image008

Memodifikasi Model Data Entitas ADO.NET

Setelah membuat Model Data Entitas, Anda dapat memodifikasi model dengan memanfaatkan Designer Entitas (lihat Gambar 5). Anda dapat membuka Designer Entitas kapan saja dengan mengklik dua kali file MoviesDBModel.edmx yang terkandung dalam folder Model dalam jendela Penjelajah Solusi.

Gambar 5 – Designer Model Data Entitas ADO.NET

clip_image010

Misalnya, Anda dapat menggunakan Designer Entitas untuk mengubah nama kelas yang dihasilkan Wizard Data Model Entitas. Wizard membuat kelas akses data baru bernama Film. Dengan kata lain, Wizard memberi kelas nama yang sangat sama dengan tabel database. Karena kita akan menggunakan kelas ini untuk mewakili instans Film tertentu, kita harus mengganti nama kelas dari Film menjadi Film.

Jika Anda ingin mengganti nama kelas entitas, Anda dapat mengklik dua kali pada nama kelas di Designer Entitas dan memasukkan nama baru (lihat Gambar 6). Atau, Anda dapat mengubah nama entitas di jendela Properti setelah memilih entitas di Designer Entitas.

Gambar 6 – Mengubah nama entitas

clip_image012

Ingatlah untuk menyimpan Model Data Entitas Anda setelah melakukan modifikasi dengan mengklik tombol Simpan (ikon disket). Di balik layar, Designer Entitas menghasilkan satu set kelas C#. Anda dapat melihat kelas-kelas ini dengan membuka MoviesDBModel. Designer.cs dari jendela Penjelajah Solusi.

Jangan ubah kode dalam file Designer.cs karena perubahan Anda akan ditimpa saat berikutnya Anda menggunakan Designer Entitas. Jika Anda ingin memperluas fungsionalitas kelas entitas yang ditentukan dalam file Designer.cs maka Anda dapat membuat kelas parsial dalam file terpisah.

Memilih Rekaman Database dengan Kerangka Kerja Entitas

Mari kita mulai membangun aplikasi Database Film kita dengan membuat halaman yang menampilkan daftar rekaman film. Pengontrol Beranda di Daftar 1 memaparkan tindakan bernama Index(). Tindakan Index() mengembalikan semua rekaman film dari tabel database Film dengan memanfaatkan Kerangka Kerja Entitas.

Daftar 1 – Controllers\HomeController.cs

using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace MovieEntityApp.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }

    }
}

Perhatikan bahwa pengontrol di Daftar 1 menyertakan konstruktor. Konstruktor menginisialisasi bidang tingkat kelas bernama _db. Bidang _db mewakili entitas database yang dihasilkan oleh Microsoft Entity Framework. Bidang _db adalah instans kelas MoviesDBEntities yang dihasilkan oleh Designer Entitas.

Untuk menggunakan kelasMoviesDBEntities di pengontrol Home, Anda harus mengimpor namespace MovieEntityApp.Models (MVCProjectName. Model).

Bidang _db digunakan dalam tindakan Index() untuk mengambil rekaman dari tabel database Film. Ekspresi _db. MovieSet mewakili semua rekaman dari tabel database Film. Metode ToList() digunakan untuk mengonversi kumpulan film menjadi koleksi generik objek Film (Daftar<Film>).

Rekaman film diambil dengan bantuan LINQ ke Entitas. Tindakan Index() di Listing 1 menggunakan sintaks metode LINQ untuk mengambil kumpulan rekaman database. Jika mau, Anda bisa menggunakan sintaks kueri LINQ sebagai gantinya. Dua pernyataan berikut melakukan hal yang sama:

ViewData.Model = _db.MovieSet.ToList();
ViewData.Model = (from m in _db.MovieSet select m).ToList();

Gunakan sintaks LINQ mana pun – sintaks metode atau sintaks kueri – yang menurut Anda paling intuitif. Tidak ada perbedaan performa antara kedua pendekatan – satu-satunya perbedaan adalah gaya.

Tampilan di Daftar 2 digunakan untuk menampilkan rekaman film.

Daftar 2 – Views\Home\Index.aspx

<%@ Page Language="C#"  
  Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.Movie>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<% foreach (var m in ViewData.Model)
   { %>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
    <%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
       
        <hr />
<% } %>

<%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

Tampilan di Daftar 2 berisi perulangan foreach yang berulang melalui setiap rekaman film dan menampilkan nilai properti Judul dan Direktur rekaman film. Perhatikan bahwa tautan Edit dan Hapus ditampilkan di samping setiap rekaman. Selain itu, tautan Tambahkan Film muncul di bagian bawah tampilan (lihat Gambar 7).

Gambar 7 – Tampilan Indeks

clip_image014

Tampilan Indeks adalah tampilan yang ditik. Tampilan Indeks menyertakan <direktif %@ Halaman %> dengan atribut Warisan yang mentransmisikan properti Model ke kumpulan Daftar objek Film generik yang diketik dengan kuat (Film Daftar<).

Menyisipkan Rekaman Database dengan Kerangka Kerja Entitas

Anda bisa menggunakan Kerangka Kerja Entitas untuk memudahkan menyisipkan rekaman baru ke dalam tabel database. Daftar 3 berisi dua tindakan baru yang ditambahkan ke kelas pengontrol Beranda yang bisa Anda gunakan untuk menyisipkan rekaman baru ke dalam tabel Database film.

Daftar 3 – Controllers\HomeController.cs (Tambahkan metode)

public ActionResult Add()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
    var movieToAdd = new Movie();

    // Deserialize (Include white list!)
    TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToAdd.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToAdd.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.AddToMovieSet(movieToAdd);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToAdd);
}

Tindakan Add() pertama hanya mengembalikan tampilan. Tampilan berisi formulir untuk menambahkan rekaman database film baru (lihat Gambar 8). Saat Anda mengirimkan formulir, tindakan Add() kedua dipanggil.

Perhatikan bahwa tindakan Add() kedua dihiasi dengan atribut AcceptVerbs. Tindakan ini hanya dapat dipanggil saat melakukan operasi HTTP POST. Dengan kata lain, tindakan ini hanya dapat dipanggil saat memposting formulir HTML.

Tindakan Add() kedua membuat instans baru kelas Film Kerangka Kerja Entitas dengan bantuan metode ASP.NET MVC TryUpdateModel(). Metode TryUpdateModel() mengambil bidang dalam FormCollection yang diteruskan ke metode Add() dan menetapkan nilai bidang formulir HTML ini ke kelas Film.

Saat menggunakan Kerangka Kerja Entitas, Anda harus menyediakan "daftar aman" properti saat menggunakan metode TryUpdateModel atau UpdateModel untuk memperbarui properti kelas entitas.

Selanjutnya, tindakan Tambahkan() melakukan beberapa validasi formulir sederhana. Tindakan memverifikasi bahwa properti Judul dan Direktur memiliki nilai. Jika ada kesalahan validasi, maka pesan kesalahan validasi ditambahkan ke ModelState.

Jika tidak ada kesalahan validasi, rekaman film baru ditambahkan ke tabel database Film dengan bantuan Kerangka Kerja Entitas. Rekaman baru ditambahkan ke database dengan dua baris kode berikut:

_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();

Baris pertama kode menambahkan entitas Film baru ke kumpulan film yang dilacak oleh Kerangka Kerja Entitas. Baris kedua kode menyimpan perubahan apa pun yang telah dilakukan pada Film yang dilacak kembali ke database yang mendasar.

Gambar 8 – Tampilan Tambahkan

clip_image016

Memperbarui Rekaman Database dengan Kerangka Kerja Entitas

Anda dapat mengikuti pendekatan yang hampir sama untuk mengedit rekaman database dengan Kerangka Kerja Entitas sebagai pendekatan yang baru saja kami ikuti untuk menyisipkan rekaman database baru. Daftar 4 berisi dua tindakan pengontrol baru bernama Edit(). Tindakan Edit() pertama mengembalikan formulir HTML untuk mengedit rekaman film. Tindakan Edit() kedua mencoba memperbarui database.

Daftar 4 – Controllers\HomeController.cs (Edit metode)

public ActionResult Edit(int id)
{
    // Get movie to update
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    ViewData.Model = movieToUpdate;
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
    // Get movie to update
    var id = Int32.Parse(form["id"]);
    var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

    // Deserialize (Include white list!)
    TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());

    // Validate
    if (String.IsNullOrEmpty(movieToUpdate.Title))
        ModelState.AddModelError("Title", "Title is required!");
    if (String.IsNullOrEmpty(movieToUpdate.Director))
        ModelState.AddModelError("Director", "Director is required!");

    // If valid, save movie to database
    if (ModelState.IsValid)
    {
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Otherwise, reshow form
    return View(movieToUpdate);
}

Tindakan Edit() kedua dimulai dengan mengambil rekaman Film dari database yang cocok dengan Id film yang sedang diedit. Pernyataan LINQ ke Entitas berikut ini mengambil rekaman database pertama yang cocok dengan Id tertentu:

var movieToUpdate = _db.MovieSet.First(m => m.Id == id);

Selanjutnya, metode TryUpdateModel() digunakan untuk menetapkan nilai bidang formulir HTML ke properti entitas film. Perhatikan bahwa daftar aman disediakan untuk menentukan properti yang tepat untuk diperbarui.

Selanjutnya, beberapa validasi sederhana dilakukan untuk memverifikasi bahwa properti Judul Film dan Sutradara memiliki nilai. Jika salah satu properti kehilangan nilai, maka pesan kesalahan validasi ditambahkan ke ModelState dan ModelState.IsValid mengembalikan nilai false.

Terakhir, jika tidak ada kesalahan validasi, maka tabel database Movies yang mendasar diperbarui dengan perubahan apa pun dengan memanggil metode SaveChanges().

Saat mengedit rekaman database, Anda perlu meneruskan Id rekaman yang sedang diedit ke tindakan pengontrol yang melakukan pembaruan database. Jika tidak, tindakan pengontrol tidak akan tahu rekaman mana yang akan diperbarui dalam database yang mendasar. Tampilan Edit, yang terkandung dalam Daftar 5, menyertakan bidang formulir tersembunyi yang mewakili Id rekaman database yang sedang diedit.

Daftar 5 – Views\Home\Edit.aspx

<%@ Page Language="C#" 
  Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.Movie>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Menghapus Rekaman Database dengan Kerangka Kerja Entitas

Operasi database akhir, yang perlu kita atasi dalam tutorial ini, adalah menghapus rekaman database. Anda bisa menggunakan tindakan pengontrol di Daftar 6 untuk menghapus rekaman database tertentu.

Daftar 6 -- \Controllers\HomeController.cs (Hapus tindakan)

public ActionResult Delete(int id)
{
    // Get movie to delete
    var movieToDelete = _db.MovieSet.First(m => m.Id == id);

    // Delete 
    _db.DeleteObject(movieToDelete);
    _db.SaveChanges();

    // Show Index view
    return RedirectToAction("Index");
}

Tindakan Delete() terlebih dahulu mengambil entitas Film yang cocok dengan Id yang diteruskan ke tindakan. Selanjutnya, film dihapus dari database dengan memanggil metode DeleteObject() diikuti dengan metode SaveChanges(). Akhirnya, pengguna dialihkan kembali ke tampilan Indeks.

Ringkasan

Tujuan dari tutorial ini adalah untuk menunjukkan bagaimana Anda dapat membangun aplikasi web berbasis database dengan memanfaatkan ASP.NET MVC dan Microsoft Entity Framework. Anda mempelajari cara membuat aplikasi yang memungkinkan Anda memilih, menyisipkan, memperbarui, dan menghapus rekaman database.

Pertama, kami membahas bagaimana Anda dapat menggunakan Wizard Model Data Entitas untuk menghasilkan Model Data Entitas dari dalam Visual Studio. Selanjutnya, Anda mempelajari cara menggunakan LINQ ke Entitas untuk mengambil sekumpulan rekaman database dari tabel database. Terakhir, kami menggunakan Kerangka Kerja Entitas untuk menyisipkan, memperbarui, dan menghapus rekaman database.