Bagian 2, tambahkan model ke Razor aplikasi Pages di ASP.NET Core
Artikel
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. 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.
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.
Di Penjelajah Solusi, klik kanan proyek >RazorPagesMovie 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.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.
Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.
Tambahkan folder bernama Models.
Tambahkan kelas ke Models folder bernama Movie.cs.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . 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.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Di Visual Studio Code, tekan Ctrl+F5 (Windows) atau ⌘+F5 (macOS) untuk menjalankan aplikasi tanpa penelusuran kesalahan.
Di Panel di bawah wilayah editor, pilih tab MASALAH, atau dari menu Tampilan, pilih Masalah jika saat ini tidak terlihat. Pastikan 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.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
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.UseSqlite(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.MapStaticAssets();
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.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di PMC, masukkan perintah berikut:
Add-Migration InitialCreate
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.
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()'.
Di PMC, masukkan perintah berikut:
Update-Database
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.
Klik kanan proyek RazorPagesMovie.csproj, lalu pilih Buka di Terminal Terintegrasi.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet ef migrations add InitialCreate
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.
Jalankan perintah .NET CLI berikut:
dotnet ef database update
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.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
Menentukan entitas mana yang disertakan dalam model data.
EF Core Mengoordinasikan fungsionalitas, seperti Buat, Baca, Perbarui, dan Hapus, untuk model tersebutMovie.
Kelas RazorPagesMovieContext dalam file Data/RazorPagesMovieContext.csyang dihasilkan :
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
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 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.
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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
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.UseSqlite(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.MapStaticAssets();
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).
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.
Di Penjelajah Solusi, klik kanan proyek >RazorPagesMovie 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.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.
Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.
Tambahkan folder bernama Models.
Tambahkan kelas ke Models folder bernama Movie.cs.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . 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.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Di Visual Studio Code, tekan Ctrl+F5 (Windows) atau ⌘+F5 (macOS) untuk menjalankan aplikasi tanpa penelusuran kesalahan.
Di Panel di bawah wilayah editor, pilih tab MASALAH, atau dari menu Tampilan, pilih Masalah jika saat ini tidak terlihat. Pastikan tidak ada kesalahan kompilasi.
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Tambahkan>Folder Baru.... Beri nama folder Models.
Models Klik kontrol folder, lalu pilih Tambahkan>Kelas Baru....
Dalam dialog File Baru:
Pilih Umum di panel kiri.
Pilih Kelas Kosong di panel tengah.
Beri nama kelas Film dan pilih Buat.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . Dengan atribut ini:
Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
Hanya tanggal yang ditampilkan, bukan informasi waktu.
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.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
Tambahkan paket Microsoft.EntityFrameworkCore.SqliteNuGet , yang diperlukan untuk alat perancah.
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Buka di Terminal.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Klik kontrol pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kontrol pada folder> Halaman/Film Tambahkan>Perancah Baru....
Dalam dialog Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Berikutnya.
Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):
Di kelas Model yang akan digunakan: baris, masukkan Movie.
Di Kelas DbContext untuk digunakan: baris, beri nama kelas RazorPagesMovie.Data.RazorPagesMovieContext.
Pilih Selesai.
Proses perancah mungkin membutuhkan waktu untuk diselesaikan karena paket yang diperlukan diunduh secara otomatis dan ditambahkan ke proyek.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di PMC, masukkan perintah berikut:
Add-Migration InitialCreate
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.
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()'.
Di PMC, masukkan perintah berikut:
Update-Database
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.
Klik kanan proyek RazorPagesMovie.csproj, lalu pilih Buka di Terminal Terintegrasi.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet ef migrations add InitialCreate
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.
Jalankan perintah .NET CLI berikut:
dotnet ef database update
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.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
Klik kontrol proyek RazorPagesMovie, lalu pilih Buka di Terminal.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
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.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
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()'.
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
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 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.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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).
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.
Di Penjelajah Solusi, klik kanan proyek >RazorPagesMovie 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.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.
Bangun proyek untuk memverifikasi tidak ada kesalahan kompilasi.
Tambahkan folder bernama Models.
Tambahkan kelas ke Models folder bernama Movie.cs.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . 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.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Di Visual Studio Code, tekan Ctrl+F5 (Windows) atau ⌘+F5 (macOS) untuk menjalankan aplikasi tanpa penelusuran kesalahan.
Di Panel di bawah wilayah editor, pilih tab MASALAH, atau dari menu Tampilan, pilih Masalah jika saat ini tidak terlihat. Pastikan tidak ada kesalahan kompilasi.
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Tambahkan>Folder Baru.... Beri nama folder Models.
Models Klik kontrol folder, lalu pilih Tambahkan>Kelas Baru....
Dalam dialog File Baru:
Pilih Umum di panel kiri.
Pilih Kelas Kosong di panel tengah.
Beri nama kelas Film dan pilih Buat.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . Dengan atribut ini:
Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
Hanya tanggal yang ditampilkan, bukan informasi waktu.
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.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
Tambahkan paket Microsoft.EntityFrameworkCore.SqliteNuGet , yang diperlukan untuk alat perancah.
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Buka di Terminal.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Klik kontrol pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kontrol pada folder> Halaman/Film Tambahkan>Perancah Baru....
Dalam dialog Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Berikutnya.
Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):
Di kelas Model yang akan digunakan: baris, masukkan Movie.
Di Kelas DbContext untuk digunakan: baris, beri nama kelas RazorPagesMovie.Data.RazorPagesMovieContext.
Pilih Selesai.
Proses perancah mungkin membutuhkan waktu untuk diselesaikan karena paket yang diperlukan diunduh secara otomatis dan ditambahkan ke proyek.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
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.
Klik kanan proyek RazorPagesMovie.csproj, lalu pilih Buka di Terminal Terintegrasi.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet ef migrations add InitialCreate
dotnet ef database update
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.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
Klik kontrol proyek RazorPagesMovie, lalu pilih Buka di Terminal.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
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.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
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()'.
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
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 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.
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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).
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.
Di Penjelajah Solusi, klik kanan proyek >RazorPagesMovie 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.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.
Tambahkan folder bernama Models.
Tambahkan kelas ke Models folder bernama Movie.cs.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . Dengan atribut ini:
Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
Hanya tanggal yang ditampilkan, bukan informasi waktu.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Di Jendela Alat Solusi, klik kanan proyek RazorPagesMovie, lalu pilih Tambahkan>Folder Baru.... Beri nama folder Models.
Models Klik kanan folder, lalu pilih Tambahkan>File Baru....
Dalam dialog File Baru:
Pilih Umum di panel kiri.
Pilih Kelas Kosong di panel tengah.
Beri nama kelas Film dan pilih Buat.
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 untuk menyediakan kunci primer untuk database.
Atribut [DataType] untuk menentukan jenis data di ReleaseDate bidang . Dengan atribut ini:
Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
Hanya tanggal yang ditampilkan, bukan informasi waktu.
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.
Tambahkan paket Microsoft.EntityFrameworkCore.DesignNuGet , yang diperlukan untuk alat perancah.
Dari menu Alat, pilih Pengelola>Paket NuGet Kelola Paket NuGet untuk Solusi
Pilih tab Telusuri.
Masukkan Microsoft.EntityFrameworkCore.Design dan pilih dari daftar.
Periksa Proyek lalu Pilih Instal
Pilih Saya Terima dalam dialog Penerimaan Lisensi.
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.
Dalam dialog Tambahkan Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.
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).
Dalam dialog Tambahkan Konteks Data, nama RazorPagesMovie.Data.RazorPagesMovieContext kelas dibuat.
Pilih Tambahkan.
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.
Buka shell perintah ke direktori proyek, yang berisi Program.cs file dan .csproj . Jalankan perintah berikut:
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
Buat folder Halaman/Film :
Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kanan pada folder> Halaman/Film Tambahkan>Perancah Baru....
Dalam dialog Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Berikutnya.
Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):
Di kelas Model yang akan digunakan: baris, masukkan Movie.
Di Kelas DbContext untuk digunakan: baris, beri nama kelas RazorPagesMovie.Data.RazorPagesMovieContext.
Pilih Selesai.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara memilih string koneksi SQLite dalam pengembangan dan SQL Server dalam produksi.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Kode sebelumnya tidak memanggil UseDeveloperExceptionPage dalam pengembangan karena WebApplication panggilan UseDeveloperExceptionPage dalam mode pengembangan.
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();
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.UseSqlite(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.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di PMC, masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Di Jendela Alat Solusi, klik kanan proyek RazorPagesMovie, lalu pilih Buka di Terminal.
Jendela Terminal terbuka dengan prompt perintah di direktori proyek, yang berisi file Program.cs dan .csproj.
Jalankan perintah .NET CLI berikut:
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
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();
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.UseSqlite(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();
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
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 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.
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).
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.
Di Penjelajah Solusi, klik kanan proyek >RazorPagesMovie 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.
Tambahkan folder bernama Models.
Tambahkan kelas ke Models folder bernama Movie.cs.
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.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Jika Anda mendapatkan kesalahan perancah, verifikasi Moniker Kerangka Kerja Target (TFM) cocok dengan versi paket NuGet dalam file proyek. Misalnya, file proyek berikut menggunakan versi 5.0 untuk .NET dan paket NuGet yang tercantum:
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Tambahkan>Folder Baru.... Beri nama folder Models.
Models Klik kontrol folder, lalu pilih Tambahkan>File Baru....
Dalam dialog File Baru:
Pilih Umum di panel kiri.
Pilih Kelas Kosong di panel tengah.
Beri nama kelas Film dan pilih Baru.
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.
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.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara menyuntikkan IWebHostEnvironment ke dalam Startup. IWebHostEnvironment disuntikkan sehingga ConfigureServices dapat menggunakan SQLite dalam pengembangan dan SQL Server dalam produksi.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Buat folder Halaman/Film :
Klik kontrol pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kontrol pada folder> Halaman/Film Tambahkan>Perancah Baru....
Dalam dialog Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Berikutnya.
Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):
Di Kelas DbContext untuk digunakan: baris, beri nama kelas RazorPagesMovie.Data.RazorPagesMovieContext.
Pilih Selesai.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara menyuntikkan IWebHostEnvironment ke dalam Startup. IWebHostEnvironment disuntikkan sehingga ConfigureServices dapat menggunakan SQLite dalam pengembangan dan SQL Server dalam produksi.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
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.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di PMC, masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Jalankan perintah .NET CLI berikut:
dotnet ef migrations add InitialCreate
dotnet ef database update
Catatan
Untuk SQLite, jenis kolom untuk Price bidang diatur ke TEXT. Ini diselesaikan di langkah selanjutnya.
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.
Periksa metode Up.
Menguji aplikasi
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 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.
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:
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.
Klik kanan proyek> RazorPagesMovie 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.
Tambahkan kelas ke Models folder bernama Movie.cs.
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.
Penyedia EF Core SQLite, yang menginstal EF Core paket sebagai dependensi.
Paket yang diperlukan untuk perancah: Microsoft.VisualStudio.Web.CodeGeneration.Design dan Microsoft.EntityFrameworkCore.SqlServer.
Untuk panduan tentang beberapa konfigurasi lingkungan yang mengizinkan aplikasi mengonfigurasi konteks databasenya berdasarkan lingkungan, lihat Menggunakan beberapa lingkungan di ASP.NET Core.
Catatan
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Jika Anda mendapatkan kesalahan perancah, verifikasi Moniker Kerangka Kerja Target (TFM) cocok dengan versi paket NuGet dalam file proyek. Misalnya, file proyek berikut berisi versi 3.1 untuk .NET Core dan paket NuGet yang tercantum:
Dalam proyek RazorPagesMovie, buat folder baru bernama Data.
Tambahkan kelas berikut RazorPagesMovieContext ke folder 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 DbSet properti untuk kumpulan entitas. Dalam terminologi Kerangka Kerja Entitas, kumpulan entitas biasanya sesuai dengan tabel database, dan entitas sesuai dengan baris dalam tabel. Kode tidak akan dikompilasi hingga dependensi ditambahkan di langkah selanjutnya.
Menambahkan string koneksi database
Tambahkan string koneksi ke file seperti yang appsettings.json diperlihatkan dalam kode yang disorot berikut:
Tambahkan pernyataan berikut using di bagian Startup.csatas :
using RazorPagesMovie.Data;
using Microsoft.EntityFrameworkCore;
Daftarkan konteks database dengan kontainer injeksi dependensi di Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
Di Jendela Alat Solusi, klik kontrol proyek RazorPagesMovie, lalu pilih Tambahkan>Folder Baru.... Beri nama folder Models.
Models Klik kanan folder, lalu pilih Tambahkan>File Baru....
Dalam dialog File Baru:
Pilih Umum di panel kiri.
Pilih Kelas Kosong di panel tengah.
Beri nama kelas Film dan pilih Baru.
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.
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.
Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kanan pada folder> Halaman/Film Tambahkan>Item Perancah Baru.
Dalam dialog Tambahkan Perancah, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Tambahkan.
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.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Buka jendela perintah di direktori proyek, yang berisi Program.csfile , Startup.cs, dan .csproj .
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara menyuntikkan IWebHostEnvironment ke Startup. IWebHostEnvironment disuntikkan sehingga ConfigureServices dapat menggunakan SQLite dalam pengembangan dan SQL Server dalam produksi.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Buat folder Halaman/Film :
Klik kanan pada folder >Halaman Tambahkan>Folder Baru.
Beri nama folder Film.
Klik kanan pada folder> Halaman/Film Tambahkan>Perancah Baru....
Dalam dialog Perancah Baru, pilih Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD)>Berikutnya.
Selesaikan dialog Tambahkan Razor Halaman menggunakan Kerangka Kerja Entitas (CRUD):
Di menu drop-down Kelas model , pilih, atau ketik, Film (RazorPagesMovie.Models).
Di baris Kelas konteks data, ketik nama untuk kelas baru, RazorPagesMovie.Data. RazorPagesMovieContext. Perubahan ini tidak diperlukan. Ini membuat kelas konteks database dengan namespace yang benar.
Pilih Tambahkan.
File appsettings.json diperbarui dengan string koneksi digunakan untuk menyambungkan ke database lokal.
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Gunakan SQLite untuk pengembangan, SQL Server untuk produksi
Ketika SQLite dipilih, kode yang dihasilkan templat siap untuk pengembangan. Kode berikut menunjukkan cara menyuntikkan IWebHostEnvironment ke Startup. IWebHostEnvironment disuntikkan sehingga ConfigureServices dapat menggunakan SQLite dalam pengembangan dan SQL Server dalam produksi.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Secara default arsitektur biner .NET yang akan diinstal mewakili arsitektur OS yang sedang berjalan. Untuk menentukan arsitektur OS yang berbeda, lihat penginstalan alat dotnet, opsi --arch.
Untuk informasi selengkapnya, lihat Masalah GitHub dotnet/AspNetCore.Docs #29262.
Jalankan perintah .NET CLI berikut:
dotnet ef migrations add InitialCreate
dotnet ef database update
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.
Periksa metode Up.
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 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.
Sumber untuk konten ini dapat ditemukan di GitHub, yang juga dapat Anda gunakan untuk membuat dan meninjau masalah dan menarik permintaan. Untuk informasi selengkapnya, lihat panduan kontributor kami.