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 Microsoft
Tujuan dari tutorial ini adalah untuk menjelaskan salah satu metode pembuatan kelas model untuk aplikasi MVC ASP.NET. Dalam tutorial ini, Anda mempelajari cara membangun kelas model dan melakukan akses database dengan memanfaatkan Microsoft LINQ ke SQL.
Tujuan dari tutorial ini adalah untuk menjelaskan salah satu metode pembuatan kelas model untuk aplikasi MVC ASP.NET. Dalam tutorial ini, Anda mempelajari cara membangun kelas model dan melakukan akses database dengan memanfaatkan Microsoft LINQ ke SQL.
Dalam tutorial ini, kami membangun aplikasi database Film dasar. Kita mulai dengan membuat aplikasi database Film dengan cara tercepat dan term mudah. Kami melakukan semua akses data langsung dari tindakan pengontrol kami.
Selanjutnya, Anda mempelajari cara menggunakan pola Repositori. Menggunakan pola Repositori membutuhkan sedikit lebih banyak pekerjaan. Namun, keuntungan mengadopsi pola ini adalah memungkinkan Anda untuk membangun aplikasi yang dapat disesuaikan untuk diubah dan dapat dengan mudah diuji.
Apa itu Kelas Model?
Model MVC berisi semua logika aplikasi yang tidak terkandung dalam tampilan MVC atau pengontrol MVC. Secara khusus, model MVC berisi semua logika bisnis aplikasi dan akses data Anda.
Anda dapat menggunakan berbagai teknologi yang berbeda untuk mengimplementasikan logika akses data Anda. Misalnya, Anda dapat membuat kelas akses data menggunakan kelas Microsoft Entity Framework, NHibernate, Subsonic, atau ADO.NET.
Dalam tutorial ini, saya menggunakan LINQ ke SQL untuk mengkueri dan memperbarui database. LINQ ke SQL memberi Anda metode yang sangat mudah untuk berinteraksi dengan database Microsoft SQL Server. Namun, penting untuk dipahami bahwa kerangka kerja MVC ASP.NET tidak terkait dengan LINQ ke SQL dengan cara apa pun. ASP.NET MVC kompatibel dengan teknologi akses data apa pun.
Membuat Database Film
Dalam tutorial ini -- untuk menggambarkan bagaimana Anda dapat membangun kelas model -- kami membangun aplikasi database Film sederhana. Langkah pertama adalah membuat database baru. Klik kanan folder App_Data di jendela Penjelajah Solusi dan pilih opsi menu Tambahkan, Item Baru. Pilih templat SQL Server Database, beri nama MoviesDB.mdf, dan klik tombol Tambahkan (lihat Gambar 1).
Gambar 01: Menambahkan Database SQL Server baru (Klik untuk melihat gambar ukuran penuh)
Setelah membuat database baru, Anda bisa membuka database dengan mengklik dua kali file MoviesDB.mdf di folder App_Data. Mengklik dua kali file MoviesDB.mdf akan membuka jendela Penjelajah Server (lihat Gambar 2).
Jendela Penjelajah Server disebut jendela Penjelajah Database saat menggunakan Visual Web Developer.
Gambar 02: Menggunakan jendela Server Explorer (Klik untuk melihat gambar ukuran penuh)
Kita perlu menambahkan satu tabel ke database kita yang mewakili film kita. Klik kanan folder Tabel dan pilih opsi menu Tambahkan Tabel Baru. Memilih opsi menu ini membuka Designer Tabel (lihat Gambar 3).
Gambar 03: Tabel Designer (Klik untuk melihat gambar ukuran penuh)
Kita perlu menambahkan kolom berikut ke tabel database kita:
Nama Kolom | Jenis Data | Perbolehkan Null |
---|---|---|
Id | Int | Salah |
Judul | Nvarchar(200) | FALSE |
direktur | Nvarchar(50) | Salah |
Anda perlu melakukan dua hal khusus ke kolom Id. Pertama, Anda perlu menandai kolom Id sebagai kolom kunci utama dengan memilih kolom di Designer Tabel dan mengklik ikon kunci. LINQ ke SQL mengharuskan Anda menentukan kolom kunci utama saat melakukan penyisipan atau pembaruan terhadap database.
Selanjutnya, Anda perlu menandai kolom Id sebagai kolom Identitas dengan menetapkan nilai Ya ke properti Is Identity (lihat Gambar 3). Kolom Identitas adalah kolom yang diberi nomor baru secara otomatis setiap kali Anda menambahkan baris data baru ke tabel.
Setelah Anda membuat perubahan ini, simpan tabel dengan nama tblMovie. Anda dapat menyimpan tabel dengan mengklik tombol Simpan.
Membuat LINQ ke Kelas SQL
Model MVC kami akan berisi kelas LINQ ke SQL yang mewakili tabel database tblMovie. Cara termampu untuk membuat LINQ ini ke kelas SQL adalah dengan mengklik kanan folder Model, pilih Tambahkan, Item Baru, pilih templat LINQ ke Kelas SQL, beri kelas nama Movie.dbml, dan klik tombol Tambahkan (lihat Gambar 4).
Gambar 04: Membuat LINQ ke kelas SQL (Klik untuk melihat gambar ukuran penuh)
Segera setelah Anda membuat Movie LINQ ke Kelas SQL, Designer Relasional Objek muncul. Anda bisa menyeret tabel database dari jendela Server Explorer ke Designer Relasional Objek untuk membuat LINQ ke Kelas SQL yang mewakili tabel database tertentu. Kita perlu menambahkan tabel database tblMovie ke Designer Relasional Objek (lihat Gambar 4).
Gambar 05: Menggunakan Designer Relasional Objek (Klik untuk melihat gambar ukuran penuh)
Secara default, Designer Relasional Objek membuat kelas dengan nama yang sangat sama dengan tabel database yang Anda seret ke Designer. Namun, kami tidak ingin memanggil kelas kami tblMovie. Oleh karena itu, klik nama kelas di Designer dan ubah nama kelas menjadi Film.
Terakhir, ingatlah untuk mengklik tombol Simpan (gambar floppy) untuk menyimpan LINQ ke Kelas SQL. Jika tidak, LINQ ke Kelas SQL tidak akan dihasilkan oleh Designer Relasional Objek.
Menggunakan LINQ ke SQL dalam Tindakan Pengontrol
Sekarang setelah kita memiliki kelas LINQ ke SQL, kita dapat menggunakan kelas-kelas ini untuk mengambil data dari database. Di bagian ini, Anda mempelajari cara menggunakan LINQ ke kelas SQL langsung dalam tindakan pengontrol. Kami akan menampilkan daftar film dari tabel database tblMovies dalam tampilan MVC.
Pertama, kita perlu memodifikasi kelas HomeController. Kelas ini dapat ditemukan di folder Pengontrol aplikasi Anda. Ubah kelas sehingga terlihat seperti kelas di Daftar 1.
Daftar 1 – Controllers\HomeController.vb
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Function Index()
Dim dataContext As New MovieDataContext()
Dim movies = From m In dataContext.Movies _
Select m
return View(movies)
End Function
End Class
Tindakan Index() di Listing 1 menggunakan kelas LINQ ke SQL DataContext (MovieDataContext) untuk mewakili database MoviesDB. Kelas MoveDataContext dihasilkan oleh Designer Relasional Objek Visual Studio.
Kueri LINQ dilakukan terhadap DataContext untuk mengambil semua film dari tabel database tblMovies. Daftar film ditetapkan ke variabel lokal bernama film. Akhirnya, daftar film diteruskan ke tampilan melalui data tampilan.
Untuk menampilkan film, kita selanjutnya perlu memodifikasi tampilan Indeks. Anda dapat menemukan tampilan Indeks di folder Views\Home\. Perbarui tampilan Indeks sehingga terlihat seperti tampilan di Daftar 2.
Daftar 2 – Views\Home\Index.aspx
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<%@ Import Namespace="MvcApplication1" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<% For Each m As Movie In ViewData.Model%>
<li><%= m.Title %></li>
<% Next%>
</ul>
</asp:Content>
Perhatikan bahwa tampilan Indeks yang dimodifikasi menyertakan <direktif %@ import namespace %> di bagian atas tampilan. Arahan ini mengimpor namespace layanan MvcApplication1. Kita memerlukan namespace layanan ini untuk bekerja dengan kelas model - khususnya, kelas Film -- dalam tampilan.
Tampilan di Daftar 2 berisi perulangan Untuk Setiap yang melakukan iterasi melalui semua item yang diwakili oleh properti ViewData.Model. Nilai properti Judul ditampilkan untuk setiap film.
Perhatikan bahwa nilai properti ViewData.Model ditransfer ke IEnumerable. Ini diperlukan untuk mengulang konten ViewData.Model. Opsi lain di sini adalah membuat tampilan yang sangat ditik. Saat Anda membuat tampilan yang diketik dengan kuat, Anda mentransmisikan properti ViewData.Model ke jenis tertentu di kelas tampilan code-behind.
Jika Anda menjalankan aplikasi setelah memodifikasi kelas HomeController dan tampilan Indeks, Anda akan mendapatkan halaman kosong. Anda akan mendapatkan halaman kosong karena tidak ada rekaman film dalam tabel database tblMovies.
Untuk menambahkan rekaman ke tabel database tblMovies, klik kanan tabel database tblMovies di jendela Server Explorer (jendela Penjelajah Database di Visual Web Developer) dan pilih opsi menu Perlihatkan Data Tabel. Anda bisa menyisipkan rekaman film dengan menggunakan kisi yang muncul (lihat Gambar 5).
Gambar 06: Menyisipkan film(Klik untuk melihat gambar ukuran penuh)
Setelah Anda menambahkan beberapa rekaman database ke tabel tblMovies, dan Anda menjalankan aplikasi, Anda akan melihat halaman di Gambar 7. Semua rekaman database film ditampilkan dalam daftar berpoin.
Gambar 07: Menampilkan film dengan tampilan Indeks (Klik untuk melihat gambar ukuran penuh)
Menggunakan Pola Repositori
Di bagian sebelumnya, kami menggunakan LINQ ke kelas SQL langsung dalam tindakan pengontrol. Kami menggunakan kelas MovieDataContext langsung dari tindakan pengontrol Index(). Tidak ada yang salah dengan melakukan ini dalam kasus aplikasi sederhana. Namun, bekerja langsung dengan LINQ ke SQL di kelas pengontrol menciptakan masalah ketika Anda perlu membangun aplikasi yang lebih kompleks.
Menggunakan LINQ ke SQL dalam kelas pengontrol menyulitkan peralihan teknologi akses data di masa mendatang. Misalnya, Anda dapat memutuskan untuk beralih dari menggunakan Microsoft LINQ ke SQL ke menggunakan Microsoft Entity Framework sebagai teknologi akses data Anda. Dalam hal ini, Anda perlu menulis ulang setiap pengontrol yang mengakses database dalam aplikasi Anda.
Menggunakan LINQ ke SQL dalam kelas pengontrol juga menyulitkan untuk membangun pengujian unit untuk aplikasi Anda. Biasanya, Anda tidak ingin berinteraksi dengan database saat melakukan pengujian unit. Anda ingin menggunakan pengujian unit untuk menguji logika aplikasi Anda dan bukan server database Anda.
Untuk membangun aplikasi MVC yang lebih mudah beradaptasi dengan perubahan di masa mendatang dan yang dapat lebih mudah diuji, Anda harus mempertimbangkan untuk menggunakan pola Repositori. Saat Anda menggunakan pola Repositori, Anda membuat kelas repositori terpisah yang berisi semua logika akses database Anda.
Saat membuat kelas repositori, Anda membuat antarmuka yang mewakili semua metode yang digunakan oleh kelas repositori. Dalam pengontrol, Anda menulis kode terhadap antarmuka alih-alih repositori. Dengan demikian, Anda dapat menerapkan repositori menggunakan teknologi akses data yang berbeda di masa mendatang.
Antarmuka dalam Listing 3 diberi nama IMovieRepository dan mewakili satu metode bernama ListAll().
Daftar 3 – Models\IMovieRepository.vb
Public Interface IMovieRepository
Function ListAll() As IList(Of Movie)
End Interface
Kelas repositori di Listing 4 mengimplementasikan antarmuka IMovieRepository. Perhatikan bahwa metode ini berisi metode bernama ListAll() yang sesuai dengan metode yang diperlukan oleh antarmuka IMovieRepository.
Daftar 4 – Models\MovieRepository.vb
Public Class MovieRepository Implements IMovieRepository
Private _dataContext As MovieDataContext
Public Sub New()
_dataContext = New MovieDataContext()
End Sub
Public Function ListAll() As IList(Of Movie) Implements IMovieRepository.ListAll
Dim movies = From m In _dataContext.Movies _
Select m
Return movies.ToList()
End Function
End Class
Terakhir, kelas MoviesController di Listing 5 menggunakan pola Repositori. Ini tidak lagi menggunakan LINQ untuk kelas SQL secara langsung.
Daftar 5 – Controllers\MoviesController.vb
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
Public Class MoviesController
Inherits System.Web.Mvc.Controller
Private _repository As IMovieRepository
Sub New()
Me.New(New MovieRepository())
End Sub
Sub New(ByVal repository As IMovieRepository)
_repository = repository
End Sub
Function Index()
Return View(_repository.ListAll())
End Function
End Class
}
Perhatikan bahwa kelas MoviesController di Listing 5 memiliki dua konstruktor. Konstruktor pertama, konstruktor tanpa parameter, dipanggil saat aplikasi Anda berjalan. Konstruktor ini membuat instans kelas MovieRepository dan meneruskannya ke konstruktor kedua.
Konstruktor kedua memiliki satu parameter: parameter IMovieRepository. Konstruktor ini hanya menetapkan nilai parameter ke bidang tingkat kelas bernama _repository.
Kelas MoviesController memanfaatkan pola desain perangkat lunak yang disebut pola Injeksi Dependensi. Secara khusus, ini menggunakan sesuatu yang disebut Injeksi Dependensi Konstruktor. Anda dapat membaca lebih lanjut tentang pola ini dengan membaca artikel berikut oleh Martin Fowler:
http://martinfowler.com/articles/injection.html
Perhatikan bahwa semua kode di kelas MoviesController (dengan pengecualian konstruktor pertama) berinteraksi dengan antarmuka IMovieRepository alih-alih kelas MovieRepository yang sebenarnya. Kode berinteraksi dengan antarmuka abstrak alih-alih implementasi konkret antarmuka.
Jika Anda ingin memodifikasi teknologi akses data yang digunakan oleh aplikasi maka Anda cukup mengimplementasikan antarmuka IMovieRepository dengan kelas yang menggunakan teknologi akses database alternatif. Misalnya, Anda dapat membuat kelas EntityFrameworkMovieRepository atau kelas SubSonicMovieRepository. Karena kelas pengontrol diprogram terhadap antarmuka, Anda dapat meneruskan implementasi baru IMovieRepository ke kelas pengontrol dan kelas akan terus berfungsi.
Selain itu, jika Anda ingin menguji kelas MoviesController, maka Anda dapat meneruskan kelas repositori film palsu ke MoviesController. Anda dapat menerapkan kelas IMovieRepository dengan kelas yang tidak benar-benar mengakses database tetapi berisi semua metode yang diperlukan dari antarmuka IMovieRepository. Dengan begitu, Anda dapat menguji kelas MoviesController secara unit tanpa benar-benar mengakses database nyata.
Ringkasan
Tujuan dari tutorial ini adalah untuk menunjukkan bagaimana Anda dapat membuat kelas model MVC dengan memanfaatkan Microsoft LINQ ke SQL. Kami memeriksa dua strategi untuk menampilkan data database dalam aplikasi MVC ASP.NET. Pertama, kami membuat LINQ ke kelas SQL dan menggunakan kelas langsung dalam tindakan pengontrol. Menggunakan LINQ ke kelas SQL dalam pengontrol memungkinkan Anda menampilkan data database dengan cepat dan mudah dalam aplikasi MVC.
Selanjutnya, kami mengeksplorasi sedikit lebih sulit, tetapi jelas lebih berbudi luhur, jalur untuk menampilkan data database. Kami memanfaatkan pola Repositori dan menempatkan semua logika akses database kami di kelas repositori terpisah. Dalam pengontrol kami, kami menulis semua kode kami terhadap antarmuka alih-alih kelas konkret. Keuntungan dari pola Repositori adalah memungkinkan kita untuk dengan mudah mengubah teknologi akses database di masa depan dan memungkinkan kita untuk dengan mudah menguji kelas pengontrol kita.