Bagikan melalui


Membuat Kelas Model dengan LINQ ke SQL (C#)

oleh Microsoft

Unduh PDF

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

Menambahkan Database SQL Server baru

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.

Cuplikan layar jendela Server Explorer, yang menunjukkan bahwa folder Tabel disorot dalam hierarki folder.

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

Cuplikan layar jendela Microsoft Visual Studio, yang memperlihatkan fitur Designer Tabel.

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.

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

Membuat LINQ ke kelas SQL

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

Menggunakan Designer Relasional Objek

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 tblMoviekami . 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.cs

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

namespace MvcApplication1.Controllers
{
     [HandleError]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               var dataContext = new MovieDataContext();
               var movies = from m in dataContext.Movies
                    select m;
               return View(movies);
          }
     }
}

Tindakan Index() dalam Daftar 1 menggunakan kelas LINQ ke SQL DataContext ( MovieDataContext) untuk mewakili MoviesDB database. Kelas MoveDataContext ini dihasilkan oleh Designer Relasional Objek Visual Studio.

Kueri LINQ dilakukan terhadap DataContext untuk mengambil semua film dari tblMovies tabel database. Daftar film ditetapkan ke variabel lokal bernama movies. Akhirnya, daftar film diteruskan ke tampilan melalui data tampilan.

Untuk menampilkan film, kita selanjutnya perlu memodifikasi tampilan Indeks. Anda dapat menemukan tampilan Indeks di Views\Home\ folder . Perbarui tampilan Indeks sehingga terlihat seperti tampilan di Daftar 2.

Daftar 2 – Views\Home\Index.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

     <ul>
          <% foreach (Movie m in (IEnumerable)ViewData.Model)

          { %>
               <li> <%= m.Title %> </li>
          <% } %>
     </ul>
</asp:Content>

Perhatikan bahwa tampilan Indeks yang dimodifikasi menyertakan <%@ import namespace %> arahan di bagian atas tampilan. Direktif ini mengimpor MvcApplication1.Models namespace. Kita memerlukan namespace ini untuk bekerja dengan model kelas - khususnya, Movie kelas - dalam tampilan.

Tampilan di Daftar 2 berisi perulangan foreach yang berulang melalui semua item yang diwakili oleh ViewData.Model properti . Nilai Title properti ditampilkan untuk setiap movie.

Perhatikan bahwa nilai properti dilemparkan ViewData.Model ke IEnumerable. Ini diperlukan untuk mengulang isi ViewData.Model. Opsi lain di sini adalah membuat .view Saat Anda membuat yang diketik viewdengan kuat, Anda mentransmisikan ViewData.Model properti ke jenis tertentu di kelas kode belakang tampilan.

Jika Anda menjalankan aplikasi setelah memodifikasi HomeController kelas dan tampilan Indeks, Anda akan mendapatkan halaman kosong. Anda akan mendapatkan halaman kosong karena tidak ada rekaman film dalam tblMovies tabel database.

Untuk menambahkan rekaman ke tblMovies tabel database, klik tblMovies kanan tabel database di jendela Penjelajah Server (jendela Penjelajah Database di Pengembang Web Visual) dan pilih opsi menu Perlihatkan Data Tabel. Anda bisa menyisipkan movie rekaman dengan menggunakan kisi yang muncul (lihat Gambar 6).

Menyisipkan film

Gambar 06: Menyisipkan film(Klik untuk melihat gambar ukuran penuh)

Setelah Anda menambahkan beberapa rekaman database ke tblMovies tabel, dan Anda menjalankan aplikasi, Anda akan melihat halaman di Gambar 7. Semua rekaman database film ditampilkan dalam daftar berpoin.

Menampilkan film dengan tampilan Indeks

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 MovieDataContext kelas langsung dari Index() tindakan pengontrol. 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 dinamai IMovieRepository dan mewakili satu metode bernama ListAll().

Daftar 3 – Models\IMovieRepository.cs

using System.Collections.Generic;
namespace MvcApplication1.Models
{
     public interface IMovieRepository
     {
          IList<Movie> ListAll();
     }
}

Kelas repositori di Listing 4 mengimplementasikan IMovieRepository antarmuka. Perhatikan bahwa metode ini berisi metode bernama ListAll() yang sesuai dengan metode yang diperlukan oleh IMovieRepository antarmuka.

Daftar 4 – Models\MovieRepository.cs

using System.Collections.Generic;
using System.Linq;

namespace MvcApplication1.Models
{
     public class MovieRepository : IMovieRepository
     {
          private MovieDataContext _dataContext;

          public MovieRepository()
          {
                _dataContext = new MovieDataContext();
          }

          #region IMovieRepository Members

          public IList<Movie> ListAll()
          {
               var movies = from m in _dataContext.Movies
                    select m;
               return movies.ToList();
          }

          #endregion
     }
}

Terakhir, MoviesController kelas di Listing 5 menggunakan pola Repositori. Ini tidak lagi menggunakan LINQ untuk kelas SQL secara langsung.

Daftar 5 – Controllers\MoviesController.cs

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
     public class MoviesController : Controller
     {
          private IMovieRepository _repository;

          public MoviesController() : this(new MovieRepository())
          {
          }

          public MoviesController(IMovieRepository repository)
          {
               _repository = repository;
          }

          public ActionResult Index()
          {
               return View(_repository.ListAll());
          }
     }
}

Perhatikan bahwa MoviesController kelas di Listing 5 memiliki dua konstruktor. Konstruktor pertama, konstruktor tanpa parameter, dipanggil saat aplikasi Anda berjalan. Konstruktor ini membuat instans MovieRepository kelas dan meneruskannya ke konstruktor kedua.

Konstruktor kedua memiliki satu parameter: IMovieRepository parameter. Konstruktor ini hanya menetapkan nilai parameter ke bidang tingkat kelas bernama _repository.

Kelas MoviesController ini 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 MoviesController kelas (dengan pengecualian konstruktor pertama) berinteraksi dengan IMovieRepository antarmuka alih-alih kelas aktual MovieRepository . 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 IMovieRepository antarmuka dengan kelas yang menggunakan teknologi akses database alternatif. Misalnya, Anda dapat membuat EntityFrameworkMovieRepository kelas atau SubSonicMovieRepository kelas. Karena kelas pengontrol diprogram terhadap antarmuka, Anda dapat meneruskan implementasi IMovieRepository baru ke kelas pengontrol dan kelas akan terus berfungsi.

Selain itu, jika Anda ingin menguji MoviesController kelas , maka Anda dapat lulus kelas repositori film palsu ke HomeController. Anda dapat mengimplementasikan IMovieRepository kelas dengan kelas yang tidak benar-benar mengakses database tetapi berisi semua metode antarmuka yang IMovieRepository diperlukan. Dengan begitu, Anda dapat menguji MoviesController kelas 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.