Bagian 2, tambahkan model ke Razor aplikasi Pages di ASP.NET Core

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas model aplikasi menggunakan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah pemeta relasional objek (O/RM) yang menyederhanakan akses data. Anda menulis kelas model terlebih dahulu, dan EF Core membuat database.

Kelas model dikenal sebagai kelas POCO (dari "P lain-O ld CLR Objects") karena mereka tidak memiliki dependensi pada EF Core. Mereka menentukan properti data yang disimpan dalam database.

Menambahkan model data

  1. Di Penjelajah Solusi, klik Razorkanan proyek >PagesMovie Tambahkan>Folder Baru. Beri nama folder Models.

  2. Models Klik kanan folder. Pilih Tambahkan>Kelas. Beri nama kelas Film.

  3. Tambahkan properti berikut ke Movie kelas :

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Kelas Movie berisi:

  • Bidang ID diperlukan oleh database untuk kunci utama.

  • Atribut [DataType] yang menentukan jenis data dalam ReleaseDate properti . Dengan atribut ini:

    • Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
    • Hanya tanggal yang ditampilkan, bukan informasi waktu.
  • Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Jenis nilai yang dapat diubah ke null.

DataAnnotations dibahas dalam tutorial selanjutnya.

Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.

Perancah model film

Di bagian ini, model film di-scaffold. Artinya, alat perancah menghasilkan halaman untuk operasi Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.

  1. Buat folder Halaman/Film:

    1. Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
    2. Beri nama folder Film.
  2. Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.

    Item Perancah Baru

  3. Dalam dialog Tambahkan Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.

    Tambahkan Perancah

  4. Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):

    1. Di menu drop-down Kelas model , pilih Film (RazorPagesMovie.Models).
    2. Di baris Kelas konteks data, pilih + tanda (plus).
      1. Dalam dialog Tambahkan Konteks Data, nama RazorPagesMovie.Data.RazorPagesMovieContext kelas dibuat.
      2. Di menu drop-down Penyedia database, pilih SQL Server.
    3. Pilih Tambahkan.

    Tambahkan Razor Halaman

File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.

File dibuat dan diperbarui

Proses perancah membuat file berikut:

  • Halaman/Film: Buat, Hapus, Detail, Edit, dan Indeks.
  • Data/RazorPagesMovieContext.cs

File yang dibuat dijelaskan dalam tutorial berikutnya.

Proses perancah menambahkan kode yang disorot berikut ke Program.cs file:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Perubahan Program.cs dijelaskan nanti dalam tutorial ini.

Membuat skema database awal menggunakan fitur migrasi EF

Fitur migrasi di Entity Framework Core menyediakan cara untuk:

  • Buat skema database awal.
  • Perbarui skema database secara bertahap agar tetap sinkron dengan model data aplikasi. Data yang ada dalam database dipertahankan.

Di bagian ini, jendela Package Manager Console (PMC) digunakan untuk:

  • Tambahkan migrasi awal.
  • Perbarui database dengan migrasi awal.
  1. Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

    Menu PMC

  2. Di PMC, masukkan perintah berikut:

    Add-Migration InitialCreate
    Update-Database
    
  • Perintah Add-Migration menghasilkan kode untuk membuat skema database awal. Skema didasarkan pada model yang ditentukan dalam DbContext. Argumen InitialCreate digunakan untuk memberi nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi.

  • Perintah Update-Database menjalankan Up metode dalam migrasi yang belum diterapkan. Dalam hal ini, perintah menjalankan Up metode dalam Migrations/<time-stamp>_InitialCreate.cs file, yang membuat database.

Peringatan berikut ditampilkan, yang ditangani di langkah selanjutnya:

Tidak ada jenis yang ditentukan untuk kolom desimal 'Harga' pada jenis entitas 'Film'. Ini akan menyebabkan nilai terpotong secara diam-diam jika tidak cocok dalam presisi dan skala default. Tentukan jenis kolom server SQL secara eksplisit yang dapat mengakomodasi semua nilai menggunakan 'HasColumnType()'.

Konteks RazorPagesMovieContextdata :

  • Berasal dari Microsoft.EntityFrameworkCore.DbContext.
  • Menentukan entitas mana yang disertakan dalam model data.
  • EF Core Mengoordinasikan fungsionalitas, seperti Buat, Baca, Perbarui, dan Hapus, untuk model tersebutMovie.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Kode sebelumnya membuat properti DbSet<Movie> untuk kumpulan entitas. Dalam terminologi Entity Framework, kumpulan entitas biasanya sesuai dengan tabel database. Entitas sesuai dengan baris dalam tabel.

Nama string koneksi diteruskan ke konteks dengan memanggil metode pada objek DbContextOptions. Untuk pengembangan lokal, sistem Konfigurasi membaca string koneksi dari appsettings.json file.

Menguji aplikasi

  1. Jalankan aplikasi dan tambahkan /Movies ke URL di browser (http://localhost:port/movies).

    Jika Anda menerima kesalahan berikut:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Anda melewatkan langkah migrasi.

  2. Uji tautan Buat Baru.

    Buat halaman

    Catatan

    Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk mendukung validasi jQuery untuk lokal non-Bahasa Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Bahasa Inggris AS, aplikasi harus di globalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.

  3. Uji tautan Edit, Detail, dan Hapus.

Tutorial berikutnya menjelaskan file yang dibuat oleh perancah.

Memeriksa konteks yang terdaftar dengan injeksi dependensi

ASP.NET Core dibangun dengan injeksi dependensi. Layanan, seperti EF Core konteks database, terdaftar dengan injeksi dependensi selama startup aplikasi. Komponen yang memerlukan layanan ini (seperti Razor Pages) disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks database ditampilkan nanti dalam tutorial.

Alat perancah secara otomatis membuat konteks database dan mendaftarkannya dengan kontainer injeksi dependensi. Kode yang disorot berikut ditambahkan ke Program.cs file oleh perancah:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Pemecahan masalah dengan sampel yang telah selesai

Jika Anda mengalami masalah yang tidak dapat Anda atasi, bandingkan kode Anda dengan proyek yang telah selesai. Lihat atau unduh proyek yang selesai (cara mengunduh).

Langkah berikutnya

Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas model aplikasi menggunakan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah pemeta relasional objek (O/RM) yang menyederhanakan akses data. Anda menulis kelas model terlebih dahulu, dan EF Core membuat database.

Kelas model dikenal sebagai kelas POCO (dari "P lain-O ld CLR Objects") karena mereka tidak memiliki dependensi pada EF Core. Mereka menentukan properti data yang disimpan dalam database.

Menambahkan model data

  1. Di Penjelajah Solusi, klik Razorkanan proyek >PagesMovie Tambahkan>Folder Baru. Beri nama folder Models.

  2. Models Klik kanan folder. Pilih Tambahkan>Kelas. Beri nama kelas Film.

  3. Tambahkan properti berikut ke Movie kelas :

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models;
    
    public class Movie
    {
        public int Id { get; set; }
        public string? Title { get; set; }
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string? Genre { get; set; }
        public decimal Price { get; set; }
    }
    

Kelas Movie berisi:

  • Bidang ID diperlukan oleh database untuk kunci utama.

  • Atribut [DataType] yang menentukan jenis data dalam ReleaseDate properti . Dengan atribut ini:

    • Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
    • Hanya tanggal yang ditampilkan, bukan informasi waktu.
  • Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Jenis nilai yang dapat diubah ke null.

DataAnnotations dibahas dalam tutorial selanjutnya.

Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.

Perancah model film

Di bagian ini, model film di-scaffold. Artinya, alat perancah menghasilkan halaman untuk operasi Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.

  1. Buat folder Halaman/Film:

    1. Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
    2. Beri nama folder Film.
  2. Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.

    Item Perancah Baru

  3. Dalam dialog Tambahkan Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.

    Tambahkan Perancah

  4. Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):

    1. Di menu drop-down Kelas model , pilih Film (RazorPagesMovie.Models).
    2. Di baris Kelas konteks data, pilih + tanda (plus).
      1. Dalam dialog Tambahkan Konteks Data, nama RazorPagesMovie.Data.RazorPagesMovieContext kelas dibuat.
      2. Di menu drop-down Penyedia database, pilih SQL Server.
    3. Pilih Tambahkan.

    Tambahkan Razor Halaman

File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.

File dibuat dan diperbarui

Proses perancah membuat file berikut:

  • Halaman/Film: Buat, Hapus, Detail, Edit, dan Indeks.
  • Data/RazorPagesMovieContext.cs

File yang dibuat dijelaskan dalam tutorial berikutnya.

Proses perancah menambahkan kode yang disorot berikut ke Program.cs file:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Perubahan Program.cs dijelaskan nanti dalam tutorial ini.

Membuat skema database awal menggunakan fitur migrasi EF

Fitur migrasi di Entity Framework Core menyediakan cara untuk:

  • Buat skema database awal.
  • Perbarui skema database secara bertahap agar tetap sinkron dengan model data aplikasi. Data yang ada dalam database dipertahankan.

Di bagian ini, jendela Package Manager Console (PMC) digunakan untuk:

  • Tambahkan migrasi awal.
  • Perbarui database dengan migrasi awal.
  1. Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

    Menu PMC

  2. Di PMC, masukkan perintah berikut:

    Add-Migration InitialCreate
    Update-Database
    
  • Perintah Add-Migration menghasilkan kode untuk membuat skema database awal. Skema didasarkan pada model yang ditentukan dalam DbContext. Argumen InitialCreate digunakan untuk memberi nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi.

  • Perintah Update-Database menjalankan Up metode dalam migrasi yang belum diterapkan. Dalam hal ini, perintah menjalankan Up metode dalam Migrations/<time-stamp>_InitialCreate.cs file, yang membuat database.

Peringatan berikut ditampilkan, yang ditangani di langkah selanjutnya:

Tidak ada jenis yang ditentukan untuk kolom desimal 'Harga' pada jenis entitas 'Film'. Ini akan menyebabkan nilai terpotong secara diam-diam jika tidak cocok dalam presisi dan skala default. Tentukan jenis kolom server SQL secara eksplisit yang dapat mengakomodasi semua nilai menggunakan 'HasColumnType()'.

Konteks RazorPagesMovieContextdata :

  • Berasal dari Microsoft.EntityFrameworkCore.DbContext.
  • Menentukan entitas mana yang disertakan dalam model data.
  • EF Core Mengoordinasikan fungsionalitas, seperti Buat, Baca, Perbarui, dan Hapus, untuk model tersebutMovie.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; } = default!;
    }
}

Kode sebelumnya membuat properti DbSet<Movie> untuk kumpulan entitas. Dalam terminologi Entity Framework, kumpulan entitas biasanya sesuai dengan tabel database. Entitas sesuai dengan baris dalam tabel.

Nama string koneksi diteruskan ke konteks dengan memanggil metode pada objek DbContextOptions. Untuk pengembangan lokal, sistem Konfigurasi membaca string koneksi dari appsettings.json file.

Menguji aplikasi

  1. Jalankan aplikasi dan tambahkan /Movies ke URL di browser (http://localhost:port/movies).

    Jika Anda menerima kesalahan berikut:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Anda melewatkan langkah migrasi.

  2. Uji tautan Buat Baru.

    Buat halaman

    Catatan

    Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk mendukung validasi jQuery untuk lokal non-Bahasa Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Bahasa Inggris AS, aplikasi harus di globalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.

  3. Uji tautan Edit, Detail, dan Hapus.

Tutorial berikutnya menjelaskan file yang dibuat oleh perancah.

Memeriksa konteks yang terdaftar dengan injeksi dependensi

ASP.NET Core dibangun dengan injeksi dependensi. Layanan, seperti EF Core konteks database, terdaftar dengan injeksi dependensi selama startup aplikasi. Komponen yang memerlukan layanan ini (seperti Razor Pages) disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks database ditampilkan nanti dalam tutorial.

Alat perancah secara otomatis membuat konteks database dan mendaftarkannya dengan kontainer injeksi dependensi. Kode yang disorot berikut ditambahkan ke Program.cs file oleh perancah:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Pemecahan masalah dengan sampel yang telah selesai

Jika Anda mengalami masalah yang tidak dapat Anda atasi, bandingkan kode Anda dengan proyek yang telah selesai. Lihat atau unduh proyek yang selesai (cara mengunduh).

Langkah berikutnya

Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas model aplikasi menggunakan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah pemeta relasional objek (O/RM) yang menyederhanakan akses data. Anda menulis kelas model terlebih dahulu, dan EF Core membuat database.

Kelas model dikenal sebagai kelas POCO (dari "P lain-O ld CLR Objects") karena mereka tidak memiliki dependensi pada EF Core. Mereka menentukan properti data yang disimpan dalam database.

Menambahkan model data

  1. Di Penjelajah Solusi, klik Razorkanan proyek >PagesMovie Tambahkan>Folder Baru. Beri nama folder Models.

  2. Models Klik kanan folder. Pilih Tambahkan>Kelas. Beri nama kelas Film.

  3. Tambahkan properti berikut ke Movie kelas :

    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; } = string.Empty;
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; } = string.Empty;
            public decimal Price { get; set; }
        }
    }
    

Kelas Movie berisi:

  • Bidang ID diperlukan oleh database untuk kunci utama.

  • Atribut [DataType] yang menentukan jenis data dalam ReleaseDate properti . Dengan atribut ini:

    • Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
    • Hanya tanggal yang ditampilkan, bukan informasi waktu.

DataAnnotations dibahas dalam tutorial selanjutnya.

Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.

Perancah model film

Di bagian ini, model film di-scaffold. Artinya, alat perancah menghasilkan halaman untuk operasi Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.

  1. Tambahkan paket Microsoft.EntityFrameworkCore.DesignNuGet , yang diperlukan untuk alat perancah.

    1. Dari menu Alat, pilih Pengelola>Paket NuGet Kelola Paket NuGet untuk SolusiPengelola Paket NuGet - kelola
    2. Pilih tab Telusuri.
    3. Masukkan Microsoft.EntityFrameworkCore.Design dan pilih dari daftar.
    4. Periksa Proyek lalu Pilih Instal
    5. Pilih Saya Terima dalam dialog Penerimaan Lisensi. Pengelola Paket NuGet - tambahkan paket
  2. Buat folder Halaman/Film:

    1. Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
    2. Beri nama folder Film.
  3. Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.

    Item Perancah Baru

  4. Dalam dialog Tambahkan Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.

    Tambahkan Perancah

  5. Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):

    1. Di menu drop-down Kelas model , pilih Film (RazorPagesMovie.Models).
    2. Di baris Kelas konteks data, pilih + tanda (plus).
      1. Dalam dialog Tambahkan Konteks Data, nama RazorPagesMovie.Data.RazorPagesMovieContext kelas dibuat.
    3. Pilih Tambahkan.

    Tambahkan Razor Halaman

    Jika Anda mendapatkan pesan kesalahan yang mengatakan Bahwa Anda perlu menginstal Microsoft.EntityFrameworkCore.SqlServer paket, ulangi langkah-langkah yang dimulai dengan Tambahkan>Item Perancah Baru.

File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.

File dibuat dan diperbarui

Proses perancah membuat file berikut:

  • Halaman/Film: Buat, Hapus, Detail, Edit, dan Indeks.
  • Data/RazorPagesMovieContext.cs

File yang dibuat dijelaskan dalam tutorial berikutnya.

Proses perancah menambahkan kode yang disorot berikut ke Program.cs file:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Perubahan Program.cs dijelaskan nanti dalam tutorial ini.

Membuat skema database awal menggunakan fitur migrasi EF

Fitur migrasi di Entity Framework Core menyediakan cara untuk:

  • Buat skema database awal.
  • Perbarui skema database secara bertahap agar tetap sinkron dengan model data aplikasi. Data yang ada dalam database dipertahankan.

Di bagian ini, jendela Package Manager Console (PMC) digunakan untuk:

  • Tambahkan migrasi awal.
  • Perbarui database dengan migrasi awal.
  1. Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

    Menu PMC

  2. Di PMC, masukkan perintah berikut:

    Add-Migration InitialCreate
    Update-Database
    
    

Perintah sebelumnya menginstal alat Entity Framework Core dan menjalankan migrations perintah untuk menghasilkan kode yang membuat skema database awal.

Peringatan berikut ditampilkan, yang ditangani di langkah selanjutnya:

Tidak ada jenis yang ditentukan untuk kolom desimal 'Harga' pada jenis entitas 'Film'. Ini akan menyebabkan nilai terpotong secara diam-diam jika tidak cocok dalam presisi dan skala default. Tentukan jenis kolom server SQL secara eksplisit yang dapat mengakomodasi semua nilai menggunakan 'HasColumnType()'.

Perintah migrations menghasilkan kode untuk membuat skema database awal. Skema didasarkan pada model yang ditentukan dalam DbContext. Argumen InitialCreate digunakan untuk memberi nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi.

Perintah update menjalankan Up metode dalam migrasi yang belum diterapkan. Dalam hal ini, update menjalankan Up metode dalam Migrations/<time-stamp>_InitialCreate.cs file, yang membuat database.

Memeriksa konteks yang terdaftar dengan injeksi dependensi

ASP.NET Core dibangun dengan injeksi dependensi. Layanan, seperti EF Core konteks database, terdaftar dengan injeksi dependensi selama startup aplikasi. Komponen yang memerlukan layanan ini (seperti Razor Pages) disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks database ditampilkan nanti dalam tutorial.

Alat perancah secara otomatis membuat konteks database dan mendaftarkannya dengan kontainer injeksi dependensi. Kode yang disorot berikut ditambahkan ke Program.cs file oleh perancah:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Konteks RazorPagesMovieContextdata :

  • Berasal dari Microsoft.EntityFrameworkCore.DbContext.
  • Menentukan entitas mana yang disertakan dalam model data.
  • EF Core Mengoordinasikan fungsionalitas, seperti Buat, Baca, Perbarui, dan Hapus, untuk model tersebutMovie.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie>? Movie { get; set; }
    }
}

Kode sebelumnya membuat properti DbSet<Movie> untuk kumpulan entitas. Dalam terminologi Entity Framework, kumpulan entitas biasanya sesuai dengan tabel database. Entitas sesuai dengan baris dalam tabel.

Nama string koneksi diteruskan ke konteks dengan memanggil metode pada objek DbContextOptions. Untuk pengembangan lokal, sistem Konfigurasi membaca string koneksi dari appsettings.json file.

Menguji aplikasi

  1. Jalankan aplikasi dan tambahkan /Movies ke URL di browser (http://localhost:port/movies).

    Jika Anda menerima kesalahan berikut:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Anda melewatkan langkah migrasi.

  2. Uji tautan Buat Baru.

    Buat halaman

    Catatan

    Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk mendukung validasi jQuery untuk lokal non-Bahasa Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Bahasa Inggris AS, aplikasi harus di globalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.

  3. Uji tautan Edit, Detail, dan Hapus.

Tutorial berikutnya menjelaskan file yang dibuat oleh perancah.

Pemecahan masalah dengan sampel yang telah selesai

Jika Anda mengalami masalah yang tidak dapat Anda atasi, bandingkan kode Anda dengan proyek yang telah selesai. Lihat atau unduh proyek yang selesai (cara mengunduh).

Langkah berikutnya

Di bagian ini, kelas ditambahkan untuk mengelola film dalam database. Kelas model aplikasi menggunakan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah pemeta relasional objek (O/RM) yang menyederhanakan akses data. Anda menulis kelas model terlebih dahulu, dan EF Core membuat database.

Kelas model dikenal sebagai kelas POCO (dari "P lain-O ld CLR Objects") karena mereka tidak memiliki dependensi pada EF Core. Mereka menentukan properti data yang disimpan dalam database.

Lihat atau unduh sampel kode (cara mengunduh).

Menambahkan model data

  1. Di Penjelajah Solusi, klik Razorkanan proyek >PagesMovie Tambahkan>Folder Baru. Beri nama folder Models.

  2. Models Klik kanan folder. Pilih Tambahkan>Kelas. Beri nama kelas Film.

  3. Tambahkan properti berikut ke Movie kelas :

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Kelas Movie berisi:

  • Bidang ID diperlukan oleh database untuk kunci utama.

  • [DataType(DataType.Date)]: Atribut [DataType] menentukan jenis data (Date). Dengan atribut ini:

    • Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
    • Hanya tanggal yang ditampilkan, bukan informasi waktu.

DataAnnotations dibahas dalam tutorial selanjutnya.

Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.

Perancah model film

Di bagian ini, model film di-scaffold. Artinya, alat perancah menghasilkan halaman untuk operasi Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.

  1. Buat folder Halaman/Film :

    1. Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
    2. Beri nama folder Film.
  2. Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.

    Item Perancah Baru

  3. Dalam dialog Tambahkan Perancah, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.

    Tambahkan Perancah

  4. Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):

    1. Di menu drop-down Kelas model , pilih Film (RazorPagesMovie.Models).
    2. Di baris Kelas konteks data, pilih + tanda (plus).
      1. Dalam dialog Tambahkan Konteks Data, nama RazorPagesMovie.Data.RazorPagesMovieContext kelas dibuat.
    3. Pilih Tambahkan.

    Tambahkan Razor Halaman

File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.

File dibuat dan diperbarui

Proses perancah membuat file berikut:

  • Halaman/Film: Buat, Hapus, Detail, Edit, dan Indeks.
  • Data/RazorPagesMovieContext.cs

File yang diperbarui

  • Startup.cs

File yang dibuat dan diperbarui dijelaskan di bagian berikutnya.

Membuat skema database awal menggunakan fitur migrasi EF

Fitur migrasi di Entity Framework Core menyediakan cara untuk:

  • Buat skema database awal.
  • Perbarui skema database secara bertahap agar tetap sinkron dengan model data aplikasi. Data yang ada dalam database dipertahankan.

Di bagian ini, jendela Package Manager Console (PMC) digunakan untuk:

  • Tambahkan migrasi awal.
  • Perbarui database dengan migrasi awal.
  1. Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

    Menu PMC

  2. Di PMC, masukkan perintah berikut:

    Add-Migration InitialCreate
    Update-Database
    

Untuk SQL Server, perintah sebelumnya menghasilkan peringatan berikut: "Tidak ada jenis yang ditentukan untuk kolom desimal 'Harga' pada jenis entitas 'Film'. Ini akan menyebabkan nilai terpotong secara diam-diam jika tidak cocok dalam presisi dan skala default. Tentukan jenis kolom server SQL secara eksplisit yang dapat mengakomodasi semua nilai menggunakan 'HasColumnType()'."

Abaikan peringatan, karena akan ditangani di langkah selanjutnya.

Perintah migrations menghasilkan kode untuk membuat skema database awal. Skema didasarkan pada model yang ditentukan dalam DbContext. Argumen InitialCreate digunakan untuk memberi nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi.

Perintah update menjalankan Up metode dalam migrasi yang belum diterapkan. Dalam hal ini, update menjalankan Up metode dalam Migrations/<time-stamp>_InitialCreate.cs file, yang membuat database.

Memeriksa konteks yang terdaftar dengan injeksi dependensi

ASP.NET Core dibangun dengan injeksi dependensi. Layanan, seperti EF Core konteks database, terdaftar dengan injeksi dependensi selama startup aplikasi. Komponen yang memerlukan layanan ini (seperti Razor Pages) disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks database ditampilkan nanti dalam tutorial.

Alat perancah secara otomatis membuat konteks database dan mendaftarkannya dengan kontainer injeksi dependensi.

Periksa metode Startup.ConfigureServices. Garis yang disorot ditambahkan oleh perancah:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Fungsionalitas RazorPagesMovieContext koordinatEF Core, seperti Buat, Baca, Perbarui, dan Hapus, untuk model.Movie Konteks data (RazorPagesMovieContext) berasal dari Microsoft.EntityFrameworkCore.DbContext. Konteks data menentukan entitas mana yang disertakan dalam model data.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Kode sebelumnya membuat properti DbSet<Movie> untuk kumpulan entitas. Dalam terminologi Entity Framework, kumpulan entitas biasanya sesuai dengan tabel database. Entitas sesuai dengan baris dalam tabel.

Nama string koneksi diteruskan ke konteks dengan memanggil metode pada objek DbContextOptions. Untuk pengembangan lokal, sistem Konfigurasi membaca string koneksi dari appsettings.json file.

Menguji aplikasi

  1. Jalankan aplikasi dan tambahkan /Movies ke URL di browser (http://localhost:port/movies).

    Jika Anda menerima kesalahan berikut:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Anda melewatkan langkah migrasi.

  2. Uji tautan Buat.

    Buat halaman

    Catatan

    Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk mendukung validasi jQuery untuk lokal non-Bahasa Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Bahasa Inggris AS, aplikasi harus di globalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.

  3. Uji tautan Edit, Detail, dan Hapus.

Pengelogan SQL Core Kerangka Kerja Entitas

Konfigurasi pengelogan biasanya disediakan oleh bagian Logging dari file appsettings.{Environment}.json. Untuk mencatat pernyataan SQL, tambahkan "Microsoft.EntityFrameworkCore.Database.Command": "Information" ke appsettings.Development.json file:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

Dengan ON sebelumnya JS, pernyataan SQL ditampilkan pada baris perintah dan di jendela output Visual Studio.

Untuk informasi selengkapnya, lihat Pengelogan di .NET Core dan ASP.NET Core dan masalah GitHub ini.

Tutorial berikutnya menjelaskan file yang dibuat oleh perancah.

Langkah berikutnya

Di bagian ini, kelas ditambahkan untuk mengelola film. Kelas model aplikasi menggunakan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah pemeta relasional objek (O/RM) yang menyederhanakan akses data.

Kelas model dikenal sebagai kelas POCO (dari "objek CLR biasa") karena tidak memiliki dependensi pada EF Core. Mereka menentukan properti data yang disimpan dalam database.

Lihat atau unduh sampel kode (cara mengunduh).

Menambahkan model data

RazorKlik kanan proyek> PagesMovie Tambahkan>Folder Baru. Beri nama folder Models.

Models Klik kanan folder. Pilih Tambahkan>Kelas. Beri nama kelas Film.

Tambahkan properti berikut ke Movie kelas :

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Kelas Movie berisi:

  • Bidang ID diperlukan oleh database untuk kunci utama.

  • [DataType(DataType.Date)]: Atribut DataType menentukan jenis data (Date). Dengan atribut ini:

    • Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
    • Hanya tanggal yang ditampilkan, bukan informasi waktu.

DataAnnotations dibahas dalam tutorial selanjutnya.

DataAnnotations dibahas dalam tutorial selanjutnya.

Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.

Perancah model film

Di bagian ini, model film di-scaffold. Artinya, alat perancah menghasilkan halaman untuk operasi Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.

Buat folder Halaman/Film :

  • Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
  • Beri nama folder Film.

Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.

Item Scaffolded Baru di VScode

Dalam dialog Tambahkan Perancah, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.

Menambahkan Scaffold pada VScode

Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):

  • Di menu drop-down Kelas model , pilih Film (RazorPagesMovie.Models).
  • Di baris Kelas konteks data, pilih + tanda (plus) dan ubah nama yang dihasilkan dari RazorPagesMovie.Models.RazorPagesMovieContext ke RazorPagesMovie.Data.RazorPagesMovieContext. Perubahan ini tidak diperlukan. Ini membuat kelas konteks database dengan namespace yang benar.
  • Pilih Tambahkan.

Menambahkan Razor Halaman di VScode

File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.

File dibuat

Proses perancah membuat dan memperbarui file berikut:

  • Halaman/Film: Buat, Hapus, Detail, Edit, dan Indeks.
  • Data/RazorPagesMovieContext.cs

Diperbarui

  • Startup.cs

File yang dibuat dan diperbarui dijelaskan di bagian berikutnya.

Migrasi awal

Di bagian ini, Package Manager Console (PMC) digunakan untuk:

  • Tambahkan migrasi awal.
  • Perbarui database dengan migrasi awal.

Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

Menu PMC

Di PMC, masukkan perintah berikut:

Add-Migration InitialCreate
Update-Database

Perintah sebelumnya menghasilkan peringatan berikut: "Tidak ada jenis yang ditentukan untuk kolom desimal 'Harga' pada jenis entitas 'Film'. Ini akan menyebabkan nilai terpotong secara diam-diam jika tidak cocok dalam presisi dan skala default. Tentukan jenis kolom server SQL secara eksplisit yang dapat mengakomodasi semua nilai menggunakan 'HasColumnType()'."

Abaikan peringatan, karena akan ditangani di langkah selanjutnya.

Perintah migrasi menghasilkan kode untuk membuat skema database awal. Skema didasarkan pada model yang ditentukan dalam DbContext. Argumen InitialCreate digunakan untuk memberi nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi.

Perintah update menjalankan Up metode dalam migrasi yang belum diterapkan. Dalam hal ini, update menjalankan Up metode dalam Migrations/<time-stamp>_InitialCreate.cs file, yang membuat database.

Memeriksa konteks yang terdaftar dengan injeksi dependensi

ASP.NET Core dibangun dengan injeksi dependensi. Layanan, seperti EF Core konteks database, terdaftar dengan injeksi dependensi selama startup aplikasi. Komponen yang memerlukan layanan ini, seperti Razor Pages, disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks database ditampilkan nanti dalam tutorial.

Alat perancah secara otomatis membuat konteks database dan mendaftarkannya dengan kontainer injeksi dependensi.

Periksa metode Startup.ConfigureServices. Garis yang disorot ditambahkan oleh perancah:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Fungsionalitas RazorPagesMovieContext koordinatEF Core, seperti Buat, Baca, Perbarui, dan Hapus, untuk model.Movie Konteks data (RazorPagesMovieContext) berasal dari Microsoft.EntityFrameworkCore.DbContext. Konteks data menentukan entitas mana yang disertakan dalam model data.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Kode sebelumnya membuat properti DbSet<Movie> untuk kumpulan entitas. Dalam terminologi Entity Framework, kumpulan entitas biasanya sesuai dengan tabel database. Entitas sesuai dengan baris dalam tabel.

Nama string koneksi diteruskan ke konteks dengan memanggil metode pada objek DbContextOptions. Untuk pengembangan lokal, sistem Konfigurasi membaca string koneksi dari appsettings.json file.

Menguji aplikasi

  • Jalankan aplikasi dan tambahkan /Movies ke URL di browser (http://localhost:port/movies).

Jika Anda mendapatkan kesalahan:

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

Anda melewatkan langkah migrasi.

  • Uji tautan Buat.

    Buat halaman

    Catatan

    Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk mendukung validasi jQuery untuk lokal non-Bahasa Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Bahasa Inggris AS, aplikasi harus di globalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.

  • Uji tautan Edit, Detail, dan Hapus.

Tutorial berikutnya menjelaskan file yang dibuat oleh perancah.

Langkah berikutnya