Bagikan melalui


Menambahkan Bidang Baru ke Model Film dan Tabel Database (VB)

oleh Rick Anderson

Tutorial ini akan mengajari Anda dasar-dasar membangun aplikasi Web MVC ASP.NET menggunakan Microsoft Visual Web Developer 2010 Express Service Pack 1, yang merupakan versi gratis dari Microsoft Visual Studio. Sebelum memulai, pastikan Anda telah menginstal prasyarat yang tercantum di bawah ini. Anda dapat menginstal semuanya dengan mengklik tautan berikut: Penginstal Platform Web. Atau, Anda dapat menginstal prasyarat secara individual menggunakan tautan berikut:

Jika Anda menggunakan Visual Studio 2010 alih-alih Visual Web Developer 2010, instal prasyarat dengan mengklik tautan berikut: Prasyarat Visual Studio 2010.

Proyek Visual Web Developer dengan kode sumber VB.NET tersedia untuk menyertai topik ini. Unduh versi VB.NET. Jika Anda lebih suka C#, beralihlah ke versi C# dari tutorial ini.

Di bagian ini Anda akan membuat beberapa perubahan pada kelas model dan mempelajari cara memperbarui skema database agar sesuai dengan perubahan model.

Menambahkan Properti Peringkat ke Model Film

Mulailah dengan menambahkan properti baru Rating ke kelas yang Movie sudah ada. Buka file Movie.cs dan tambahkan Rating properti seperti ini:

Public Property Rating() As String

Kelas lengkap Movie sekarang terlihat seperti kode berikut:

Public Class Movie
    Public Property ID() As Integer
    Public Property Title() As String
    Public Property ReleaseDate() As Date
    Public Property Genre() As String
    Public Property Price() As Decimal
    Public Property Rating() As String
End Class

Kompilasi ulang aplikasi menggunakan perintah menu Debug>Build Movie.

Setelah memperbarui Model kelas, Anda juga perlu memperbarui templat tampilan \Views\Movies\Index.vbhtml dan \Views\Movies\Create.vbhtml untuk mendukung properti baru Rating .

Buka file\Views\Movies\Index.vbhtml dan tambahkan <th>Rating</th> judul kolom tepat setelah kolom Harga . Kemudian tambahkan <td> kolom di dekat akhir templat untuk merender @item.Rating nilai. Di bawah ini adalah seperti apa templat tampilan Index.vbhtml yang diperbarui:

<table>
    <tr>
        <th>            Title        </th>
        <th>            ReleaseDate        </th>
        <th>            Genre        </th>
        <th>            Price        </th>
        <th>Rating</th>
        <th></th>
    </tr>

@For Each item In Model
    Dim currentItem = item
    @<tr>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Title)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Genre)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Price)
        </td>
         <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Rating)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Details", "Details", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Delete", "Delete", New With {.id = currentItem.ID})
        </td>
    </tr>
Next

</table>

Selanjutnya, buka file \Views\Movies\Create.vbhtml dan tambahkan markup berikut di dekat akhir formulir. Ini merender kotak teks sehingga Anda dapat menentukan peringkat saat film baru dibuat.

<div class="editor-label">
     @Html.LabelFor(Function(model) model.Rating)
 </div>
 <div class="editor-field">
     @Html.EditorFor(Function(model) model.Rating)
     @Html.ValidationMessageFor(Function(model) model.Rating)
 </div>

Mengelola Perbedaan Skema Model dan Database

Anda sekarang telah memperbarui kode aplikasi untuk mendukung properti baru Rating .

Sekarang jalankan aplikasi dan navigasikan ke URL /Movies . Namun, saat Anda melakukan ini, Anda akan melihat kesalahan berikut:

Cuplikan layar yang memperlihatkan jendela browser dengan kesalahan yang menyatakan Kesalahan Server di Aplikasi.

Anda melihat kesalahan ini karena kelas model yang diperbarui Movie dalam aplikasi sekarang berbeda dari Movie skema tabel database yang ada. (Tidak ada Rating kolom dalam tabel database.)

Secara default, ketika Anda menggunakan Kode Kerangka Kerja Entitas Pertama untuk membuat database secara otomatis, seperti yang Anda lakukan sebelumnya dalam tutorial ini, Code First menambahkan tabel ke database untuk membantu melacak apakah skema database sinkron dengan kelas model tempat database dihasilkan. Jika tidak sinkron, Kerangka Kerja Entitas akan melemparkan kesalahan. Ini memudahkan untuk melacak masalah pada waktu pengembangan yang mungkin hanya Anda temukan (dengan kesalahan yang tidak jelas) pada waktu proses. Fitur pemeriksaan sinkronisasi adalah yang menyebabkan pesan kesalahan ditampilkan yang baru saja Anda lihat.

Ada dua pendekatan untuk menyelesaikan kesalahan:

  1. Minta Kerangka Kerja Entitas secara otomatis menghilangkan dan membuat ulang database berdasarkan skema kelas model baru. Pendekatan ini sangat nyaman ketika melakukan pengembangan aktif pada database pengujian, karena memungkinkan Anda untuk dengan cepat mengembangkan model dan skema database bersama-sama. Namun, kelemahannya adalah Anda kehilangan data yang ada dalam database — sehingga Anda tidak ingin menggunakan pendekatan ini pada database produksi!
  2. Ubah skema database yang ada secara eksplisit sehingga cocok dengan kelas model. Keuntungan dari pendekatan ini adalah Anda menyimpan data Anda. Anda dapat membuat perubahan ini secara manual atau dengan membuat skrip perubahan database.

Untuk tutorial ini, kita akan menggunakan pendekatan pertama — Anda akan memiliki Kode Kerangka Kerja Entitas Terlebih dahulu secara otomatis membuat ulang database kapan saja model berubah.

Membuat Ulang Database secara Otomatis pada Perubahan Model

Mari kita perbarui aplikasi sehingga Code First secara otomatis menghilangkan dan membuat ulang database kapan saja Anda mengubah model untuk aplikasi.

Catatan

Peringatan Anda harus mengaktifkan pendekatan ini untuk secara otomatis menghilangkan dan membuat ulang database hanya saat Anda menggunakan database pengembangan atau pengujian, dan tidak pernah pada database produksi yang berisi data nyata. Menggunakannya di server produksi dapat menyebabkan kehilangan data.

Di Penjelajah Solusi, klik kanan folder Model, pilih Tambahkan, lalu pilih Kelas.

Cuplikan layar yang memperlihatkan jendela Penjelajah Solusi. Tambahkan dipilih di menu klik kanan Model dan Kelas dipilih di sub menu.

Beri nama kelas "MovieInitializer". MovieInitializer Perbarui kelas untuk berisi kode berikut:

using System;
Imports System
Imports System.Collections.Generic
Imports System.Data.Entity

Namespace MvcMovie.Models
    Public Class MovieInitializer
        Inherits DropCreateDatabaseIfModelChanges(Of MovieDBContext)
        Protected Overrides Sub Seed(ByVal context As MovieDBContext)
            Dim movies = New List(Of Movie) From {
             New Movie With {.Title = "When Harry Met Sally", .ReleaseDate = Date.Parse("1989-1-11"), .Genre = "Romantic Comedy", .Rating = "R", .Price = 7.99D},
             New Movie With {.Title = "Ghostbusters ", .ReleaseDate = Date.Parse("1984-3-13"), .Genre = "Comedy", .Rating = "R", .Price = 8.99D},
             New Movie With {.Title = "Ghostbusters 2", .ReleaseDate = Date.Parse("1986-2-23"), .Genre = "Comedy", .Rating = "R", .Price = 9.99D},
             New Movie With {.Title = "Rio Bravo", .ReleaseDate = Date.Parse("1959-4-15"), .Genre = "Western", .Rating = "R", .Price = 3.99D}}

            movies.ForEach(Function(d) context.Movies.Add(d))
        End Sub
    End Class
End Namespace

Kelas MovieInitializer menentukan bahwa database yang digunakan oleh model harus dihilangkan dan dibuat ulang secara otomatis jika kelas model pernah berubah. Kode menyertakan Seed metode untuk menentukan beberapa data default untuk ditambahkan secara otomatis ke database kapan saja dibuat (atau dibuat ulang). Ini menyediakan cara yang berguna untuk mengisi database dengan beberapa data sampel, tanpa mengharuskan Anda mengisinya secara manual setiap kali Anda membuat perubahan model.

Sekarang setelah Anda mendefinisikan MovieInitializer kelas, Anda akan ingin menyambungkannya sehingga setiap kali aplikasi berjalan, ia memeriksa apakah kelas model berbeda dari skema dalam database. Jika ya, Anda dapat menjalankan penginisialisasi untuk membuat ulang database agar sesuai dengan model lalu mengisi database dengan data sampel.

Buka file Global.asax yang berada di akar MvcMovies proyek:

File Global.asax berisi kelas yang menentukan seluruh aplikasi untuk proyek, dan berisi penanganan Application_Start aktivitas yang berjalan saat aplikasi pertama kali dimulai.

Application_Start Temukan metode dan tambahkan panggilan ke Database.SetInitializer di awal metode, seperti yang ditunjukkan di bawah ini:

Sub Application_Start()
        System.Data.Entity.Database.SetInitializer(Of MovieDBContext)(New MvcMovie.Models.MovieInitializer())
       
        AreaRegistration.RegisterAllAreas()

        RegisterGlobalFilters(GlobalFilters.Filters)
        RegisterRoutes(RouteTable.Routes)
    End Sub

Pernyataan Database.SetInitializer yang baru saja Anda tambahkan menunjukkan bahwa database yang digunakan oleh MovieDBContext instans harus dihapus dan dibuat ulang secara otomatis jika skema dan database tidak cocok. Dan seperti yang Anda lihat, database juga akan mengisi database dengan data sampel yang ditentukan di MovieInitializer kelas .

Tutup file Global.asax.

Jalankan kembali aplikasi dan navigasikan ke URL /Movies . Ketika aplikasi dimulai, aplikasi mendeteksi bahwa struktur model tidak lagi cocok dengan skema database. Ini secara otomatis membuat ulang database agar sesuai dengan struktur model baru dan mengisi database dengan contoh film:

7_MyMovieList_SM

Klik tautan Buat Baru untuk menambahkan film baru. Perhatikan bahwa Anda dapat menambahkan peringkat.

7_CreateRioII

Klik Buat. Film baru, termasuk peringkat, sekarang muncul di daftar film:

7_ourNewMovie_SM

Di bagian ini Anda melihat bagaimana Anda dapat memodifikasi objek model dan menjaga database tetap sinkron dengan perubahan. Anda juga mempelajari cara mengisi database yang baru dibuat dengan data sampel sehingga Anda dapat mencoba skenario. Selanjutnya, mari kita lihat bagaimana Anda dapat menambahkan logika validasi yang lebih kaya ke kelas model dan memungkinkan beberapa aturan bisnis diberlakukan.