Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Note
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 dari artikel ini.
Warning
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 9 dari artikel ini.
Oleh Rick Anderson dan Jon P Smith.
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Models/Movie.cs Perbarui file dengan kode berikut:
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Tipe referensi yang dapat bernilai null.
Menambahkan paket NuGet
Visual Studio secara otomatis menginstal paket yang diperlukan.
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat perancah untuk menghasilkan halaman Create, Read, Update, dan Delete (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Pengontrol dan pilih Tambahkan Item Perancah Baru >.
Dalam dialog Tambahkan Item Perancah Baru:
- Di panel kiri, pilih Terpasang>Umum>MVC.
- Pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework.
- Pilih Tambahkan.
Selesaikan kotak dialog Tambah Pengontrol MVC dengan tampilan, menggunakan Entity Framework:
- Di menu drop-down kelas Model, pilih Movie (MvcMovie.Models).
- Pada baris kelas konteks data, pilih tanda +(plus).
- Dalam dialog Tambahkan Konteks Data, nama kelas MvcMovie.Data.MvcMovieContext dihasilkan.
- Pilih Tambahkan.
- Di menu drop-down Penyedia database, pilih SQL Server.
- Tampilan dan Nama pengontrol: Pertahankan default.
- Pilih Tambahkan.
Jika Anda mendapatkan pesan kesalahan, pilih Tambahkan untuk kedua kalinya untuk mencobanya lagi.
Pemancangan menambahkan paket-paket berikut:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.ToolsMicrosoft.VisualStudio.Web.CodeGeneration.Design
Perancah menyediakan hal berikut:
- Pengontrol film:
Controllers/MoviesController.cs -
Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks :
Views/Movies/*.cshtml - Kelas konteks database:
Data/MvcMovieContext.cs
Perancah memperbarui hal berikut:
- Menyisipkan referensi paket yang diperlukan dalam file proyek
MvcMovie.csproj. - Mendaftarkan konteks database dalam
Program.csfile. - Menambahkan string koneksi database ke file
appsettings.json.
Pembuatan otomatis dari file-file ini dan pembaruan filenya dikenal sebagai pembuatan rangka kerja.
Halaman yang telah dirancang belum dapat digunakan karena database belum tersedia. Menjalankan aplikasi dan memilih tautan Movie App menghasilkan pesan kesalahan Tidak dapat membuka database atau tidak ada tabel seperti itu: Movie.
Buat aplikasi untuk memverifikasi bahwa tidak ada kesalahan.
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang membuat dan memperbarui database agar sesuai dengan model data.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di Package Manager Console (PMC), masukkan perintah berikut:
Add-Migration InitialCreate
-
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .
Peringatan berikut ditampilkan, yang ditangani di langkah selanjutnya:
Tidak ada jenis penyimpanan yang ditentukan untuk properti 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 di 'OnModelCreating' menggunakan 'HasColumnType', tentukan presisi dan skala menggunakan 'HasPrecision', atau konfigurasikan pengonversi nilai menggunakan 'HasConversion'.
Di PMC, masukkan perintah berikut:
Update-Database
-
Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Menguji aplikasi
Jalankan aplikasi dan pilih tautan Aplikasi Film.
Jika Anda mendapatkan pengecualian yang mirip dengan yang berikut ini, Anda mungkin telah melewatkan perintah Update-Database dalam langkah migrasi:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Note
Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.
Periksa kelas konteks basis data dan pendaftaran yang dihasilkan
Dengan EF Core, akses data dilakukan menggunakan model. Model terdiri dari kelas entitas dan objek konteks yang mewakili sesi dengan database. Objek konteks memungkinkan kueri dan penyimpanan data. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Perancah menghasilkan kelas konteks basis data Data/MvcMovieContext.cs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<MvcMovie.Models.Movie> Movie { get; set; } = default!;
}
}
Kode sebelumnya membuat properti DbSet<Movie> yang mewakili film dalam database.
Injeksi Ketergantungan
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan, seperti konteks database, terdaftar dengan DI di Program.cs. Layanan ini disediakan untuk komponen yang mengharuskannya melalui parameter konstruktor.
Dalam file Controllers/MoviesController.cs, konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks MvcMovieContext basis data ke kontroler. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Perancah menghasilkan kode yang disorot berikut di Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));
Sistem konfigurasi ASP.NET Core membaca string koneksi database "MvcMovieContext".
Memeriksa string koneksi database yang dihasilkan
Scaffolding menambahkan string koneksi ke file appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca ConnectionString kunci dari appsettings.json file.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MvcMovie.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
Dalam kode sebelumnya:
-
InitialCreate.Upmembuat tabel Film dan mengonfigurasiIdsebagai kunci utama. -
InitialCreate.Downmengembalikan perubahan skema yang dilakukan olehUpmigrasi.
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Uji halaman Buat . Masukkan dan kirim data.
Uji halaman Edit, Detail, dan Hapus .
Model bertipe kuat dan direktif @model
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah melewati model yang ditik dengan kuat di MoviesController kelas dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya, https://localhost:{PORT}/movies/details/1 mengatur:
- Pengontrol ke
moviespengontrol, segmen URL pertama. - Tindakan pada segmen URL kedua
details. - Ke
id1, segmen URL terakhir.
id dapat diteruskan dengan string kueri, seperti dalam contoh berikut:
https://localhost:{PORT}/movies/details?id=1
Parameter id didefinisikan sebagai tipe nullable (int?) dalam kasus ketika id nilai tidak disediakan.
Ekspresi lambda diteruskan ke dalam metode FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Kode mengembalikan rincian masalah jika properti Movie dari konteks data adalah null.
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model memungkinkan akses ke daftar film yang diberikan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Model Karena objek ditentukan tipe secara kuat sebagai IEnumerable<Movie> objek, setiap item dalam perulangan dianggap bertipe Movie. Di antara manfaat lainnya, kompilator memvalidasi jenis yang digunakan dalam kode.
Sumber daya tambahan
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Models/Movie.cs Perbarui file dengan kode berikut:
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Tipe referensi yang dapat bernilai null.
Menambahkan paket NuGet
Visual Studio secara otomatis menginstal paket yang diperlukan.
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat perancah untuk menghasilkan halaman Create, Read, Update, dan Delete (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Pengontrol dan pilih Tambahkan Item Perancah Baru >.
Dalam dialog Tambahkan Item Perancah Baru:
- Di panel kiri, pilih Terpasang>Umum>MVC.
- Pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework.
- Pilih Tambahkan.
Selesaikan kotak dialog Tambah Pengontrol MVC dengan tampilan, menggunakan Entity Framework:
- Di menu drop-down kelas Model, pilih Movie (MvcMovie.Models).
- Pada baris kelas konteks data, pilih tanda +(plus).
- Dalam dialog Tambahkan Konteks Data, nama kelas MvcMovie.Data.MvcMovieContext dihasilkan.
- Pilih Tambahkan.
- Di menu drop-down Penyedia database, pilih SQL Server.
- Tampilan dan Nama pengontrol: Pertahankan default.
- Pilih Tambahkan.
Jika Anda mendapatkan pesan kesalahan, pilih Tambahkan untuk kedua kalinya untuk mencobanya lagi.
Pemancangan menambahkan paket-paket berikut:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.ToolsMicrosoft.VisualStudio.Web.CodeGeneration.Design
Perancah menyediakan hal berikut:
- Pengontrol film:
Controllers/MoviesController.cs -
Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks :
Views/Movies/*.cshtml - Kelas konteks database:
Data/MvcMovieContext.cs
Perancah memperbarui hal berikut:
- Menyisipkan referensi paket yang diperlukan dalam file proyek
MvcMovie.csproj. - Mendaftarkan konteks database dalam
Program.csfile. - Menambahkan string koneksi database ke file
appsettings.json.
Pembuatan otomatis dari file-file ini dan pembaruan filenya dikenal sebagai pembuatan rangka kerja.
Halaman yang telah dirancang belum dapat digunakan karena database belum tersedia. Menjalankan aplikasi dan memilih tautan Movie App menghasilkan pesan kesalahan Tidak dapat membuka database atau tidak ada tabel seperti itu: Movie.
Buat aplikasi untuk memverifikasi bahwa tidak ada kesalahan.
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang membuat dan memperbarui database agar sesuai dengan model data.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di Package Manager Console (PMC), masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.
Perintah Update-Database menghasilkan peringatan berikut:
Tidak ada jenis penyimpanan yang ditentukan untuk properti 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 di 'OnModelCreating' menggunakan 'HasColumnType', tentukan presisi dan skala menggunakan 'HasPrecision', atau konfigurasikan pengonversi nilai menggunakan 'HasConversion'.
Abaikan peringatan sebelumnya, ini diperbaiki dalam tutorial selanjutnya.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Menguji aplikasi
Jalankan aplikasi dan pilih tautan Aplikasi Film.
Jika Anda mendapatkan pengecualian yang mirip dengan yang berikut ini, Anda mungkin telah melewatkan perintah Update-Database dalam langkah migrasi:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Note
Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.
Periksa kelas konteks basis data dan pendaftaran yang dihasilkan
Dengan EF Core, akses data dilakukan menggunakan model. Model terdiri dari kelas entitas dan objek konteks yang mewakili sesi dengan database. Objek konteks memungkinkan kueri dan penyimpanan data. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Perancah menghasilkan kelas konteks basis data Data/MvcMovieContext.cs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
}
}
Kode sebelumnya membuat properti DbSet<Movie> yang mewakili film dalam database.
Injeksi Ketergantungan
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan, seperti konteks database, terdaftar dengan DI di Program.cs. Layanan ini disediakan untuk komponen yang mengharuskannya melalui parameter konstruktor.
Dalam file Controllers/MoviesController.cs, konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks MvcMovieContext basis data ke kontroler. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Perancah menghasilkan kode yang disorot berikut di Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
Sistem konfigurasi ASP.NET Core membaca string koneksi database "MvcMovieContext".
Memeriksa string koneksi database yang dihasilkan
Scaffolding menambahkan string koneksi ke file appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}
}
Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca ConnectionString kunci dari appsettings.json file.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MvcMovie.Migrations
{
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
Dalam kode sebelumnya:
-
InitialCreate.Upmembuat tabel Film dan mengonfigurasiIdsebagai kunci utama. -
InitialCreate.Downmengembalikan perubahan skema yang dilakukan olehUpmigrasi.
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Uji halaman Buat . Masukkan dan kirim data.
Uji halaman Edit, Detail, dan Hapus .
Model bertipe kuat dan direktif @model
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah melewati model yang ditik dengan kuat di MoviesController kelas dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya, https://localhost:5001/movies/details/1 mengatur:
- Pengontrol ke
moviespengontrol, segmen URL pertama. - Tindakan pada segmen URL kedua
details. - Ke
id1, segmen URL terakhir.
id dapat diteruskan dengan string kueri, seperti dalam contoh berikut:
https://localhost:5001/movies/details?id=1
Parameter id didefinisikan sebagai tipe nullable (int?) dalam kasus ketika id nilai tidak disediakan.
Ekspresi lambda diteruskan ke dalam metode FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Kode mengembalikan rincian masalah jika properti Movie dari konteks data adalah null.
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model memungkinkan akses ke daftar film yang diberikan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Model Karena objek ditentukan tipe secara kuat sebagai IEnumerable<Movie> objek, setiap item dalam perulangan dianggap bertipe Movie. Di antara manfaat lainnya, kompilator memvalidasi jenis yang digunakan dalam kode.
Sumber daya tambahan
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Models/Movie.cs Perbarui file dengan kode berikut:
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Tipe referensi yang dapat bernilai null.
Menambahkan paket NuGet
Visual Studio secara otomatis menginstal paket yang diperlukan.
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat perancah untuk menghasilkan halaman Create, Read, Update, dan Delete (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Pengontrol dan pilih Tambahkan Item Perancah Baru >.
Dalam dialog Tambahkan Item Perancah Baru:
- Di panel kiri, pilih Terpasang>Umum>MVC.
- Pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework.
- Pilih Tambahkan.
Selesaikan kotak dialog Tambah Pengontrol MVC dengan tampilan, menggunakan Entity Framework:
- Di menu drop-down kelas Model, pilih Movie (MvcMovie.Models).
- Pada baris kelas konteks data, pilih tanda +(plus).
- Dalam dialog Tambahkan Konteks Data, nama kelas MvcMovie.Data.MvcMovieContext dihasilkan.
- Pilih Tambahkan.
- Di menu drop-down Penyedia database, pilih SQL Server.
- Tampilan dan Nama pengontrol: Pertahankan default.
- Pilih Tambahkan.
Jika Anda mendapatkan pesan kesalahan, pilih Tambahkan kedua kalinya untuk mencobanya lagi.
Pemancangan menambahkan paket-paket berikut:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.ToolsMicrosoft.VisualStudio.Web.CodeGeneration.Design
Perancah menyediakan hal berikut:
- Pengontrol film:
Controllers/MoviesController.cs -
Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks :
Views/Movies/*.cshtml - Kelas konteks database:
Data/MvcMovieContext.cs
Perancah memperbarui hal berikut:
- Menyisipkan referensi paket yang diperlukan dalam file proyek
MvcMovie.csproj. - Mendaftarkan konteks database dalam
Program.csfile. - Menambahkan string koneksi database ke file
appsettings.json.
Pembuatan otomatis dari file-file ini dan pembaruan filenya dikenal sebagai pembuatan rangka kerja.
Halaman yang telah dirancang belum dapat digunakan karena database belum tersedia. Menjalankan aplikasi dan memilih tautan Movie App menghasilkan pesan kesalahan Tidak dapat membuka database atau tidak ada tabel seperti itu: Movie.
Buat aplikasi untuk memverifikasi bahwa tidak ada kesalahan.
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang membuat dan memperbarui database agar sesuai dengan model data.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di Package Manager Console (PMC), masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.
Perintah Update-Database 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 sebelumnya, ini diperbaiki dalam tutorial selanjutnya.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Menguji aplikasi
Jalankan aplikasi dan pilih tautan Aplikasi Film.
Jika Anda mendapatkan pengecualian yang mirip dengan yang berikut ini, Anda mungkin telah melewatkan perintah Update-Database dalam langkah migrasi:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Note
Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.
Periksa kelas konteks basis data dan pendaftaran yang dihasilkan
Dengan EF Core, akses data dilakukan menggunakan model. Model terdiri dari kelas entitas dan objek konteks yang mewakili sesi dengan database. Objek konteks memungkinkan kueri dan penyimpanan data. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Perancah menghasilkan kelas konteks basis data Data/MvcMovieContext.cs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
}
}
Kode sebelumnya membuat properti DbSet<Movie> yang mewakili film dalam database.
Injeksi Ketergantungan
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan, seperti konteks database, terdaftar dengan DI di Program.cs. Layanan ini disediakan untuk komponen yang mengharuskannya melalui parameter konstruktor.
Dalam file Controllers/MoviesController.cs, konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks MvcMovieContext basis data ke kontroler. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Perancah menghasilkan kode yang disorot berikut di Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
Sistem konfigurasi ASP.NET Core membaca string koneksi database "MvcMovieContext".
Memeriksa string koneksi database yang dihasilkan
Scaffolding menambahkan string koneksi ke file appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}
}
Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca ConnectionString kunci dari appsettings.json file.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MvcMovie.Migrations
{
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
Dalam kode sebelumnya:
-
InitialCreate.Upmembuat tabel Film dan mengonfigurasiIdsebagai kunci utama. -
InitialCreate.Downmengembalikan perubahan skema yang dilakukan olehUpmigrasi.
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Uji halaman Buat . Masukkan dan kirim data.
Uji halaman Edit, Detail, dan Hapus .
Model bertipe kuat dan direktif @model
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah melewati model yang ditik dengan kuat di MoviesController kelas dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya, https://localhost:5001/movies/details/1 mengatur:
- Pengontrol ke
moviespengontrol, segmen URL pertama. - Tindakan pada segmen URL kedua
details. - Ke
id1, segmen URL terakhir.
id dapat diteruskan dengan string kueri, seperti dalam contoh berikut:
https://localhost:5001/movies/details?id=1
Parameter id didefinisikan sebagai tipe nullable (int?) dalam kasus ketika id nilai tidak disediakan.
Ekspresi lambda diteruskan ke dalam metode FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Kode mengembalikan rincian masalah jika properti Movie dari konteks data adalah null.
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model memungkinkan akses ke daftar film yang diberikan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Model Karena objek ditentukan tipe secara kuat sebagai IEnumerable<Movie> objek, setiap item dalam perulangan dianggap bertipe Movie. Di antara manfaat lainnya, kompilator memvalidasi jenis yang digunakan dalam kode.
Sumber daya tambahan
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Models/Movie.cs Perbarui file dengan kode berikut:
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Tanda tanya setelah string menunjukkan bahwa properti dapat diubah ke null. Untuk informasi selengkapnya, lihat Tipe referensi yang dapat bernilai null.
Menambahkan paket NuGet
Dari menu Alat, pilih NuGet Package Manager>Package Manager Console (PMC).
Di PMC, jalankan perintah berikut:
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Perintah sebelumnya menambahkan:
- Penyedia SQL Server EF Core. Paket dari penyedia menginstal paket EF Core sebagai dependensi.
- Utilitas yang digunakan oleh paket yang diinstal secara otomatis dalam langkah scaffolding, kemudian dalam tutorial.
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat perancah untuk menghasilkan halaman Create, Read, Update, dan Delete (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Pengontrol dan pilih Tambahkan Item Perancah Baru >.
Dalam dialog Tambahkan Perancah, pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework > Tambahkan.
Selesaikan kotak dialog Tambah Pengontrol MVC dengan tampilan, menggunakan Entity Framework:
- Di menu drop-down kelas Model, pilih Movie (MvcMovie.Models).
- Pada baris kelas konteks data, pilih tanda +(plus).
- Dalam dialog Tambahkan Konteks Data, nama kelas MvcMovie.Data.MvcMovieContext dihasilkan.
- Pilih Tambahkan.
- Tampilan dan Nama pengontrol: Pertahankan default.
- Pilih Tambahkan.
Jika Anda mendapatkan pesan kesalahan, pilih Tambahkan untuk kedua kalinya untuk mencobanya lagi.
Perancah memperbarui hal berikut:
- Menyisipkan referensi paket yang diperlukan dalam file proyek
MvcMovie.csproj. - Mendaftarkan konteks database dalam
Program.csfile. - Menambahkan string koneksi database ke file
appsettings.json.
Perancah menyediakan hal berikut:
- Pengontrol film:
Controllers/MoviesController.cs -
Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks :
Views/Movies/*.cshtml - Kelas konteks database:
Data/MvcMovieContext.cs
Pembuatan otomatis dari file-file ini dan pembaruan filenya dikenal sebagai pembuatan rangka kerja.
Halaman yang telah dirancang belum dapat digunakan karena database belum tersedia. Menjalankan aplikasi dan memilih tautan Movie App menghasilkan pesan kesalahan Tidak dapat membuka database atau tidak ada tabel seperti itu: Movie.
Membangun aplikasi
Buat aplikasi. Pengkompilasi menghasilkan beberapa peringatan tentang bagaimana null nilai ditangani. Lihat isu GitHub ini dan Jenis referensi yang dapat bernilai null untuk informasi selengkapnya.
Untuk menghilangkan peringatan dari jenis referensi yang dapat diubah ke null, hapus baris berikut dari MvcMovie.csproj file:
<Nullable>enable</Nullable>
Kami berharap dapat memperbaiki masalah ini di rilis berikutnya.
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang membuat dan memperbarui database agar sesuai dengan model data.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di Package Manager Console (PMC), masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.
Perintah Update-Database 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 sebelumnya, ini diperbaiki dalam tutorial selanjutnya.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Menguji aplikasi
Jalankan aplikasi dan pilih tautan Aplikasi Film.
Jika Anda mendapatkan pengecualian yang mirip dengan yang berikut ini, Anda mungkin telah melewatkan langkah migrasi:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Note
Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.
Periksa kelas konteks basis data dan pendaftaran yang dihasilkan
Dengan EF Core, akses data dilakukan menggunakan model. Model terdiri dari kelas entitas dan objek konteks yang mewakili sesi dengan database. Objek konteks memungkinkan kueri dan penyimpanan data. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Perancah menghasilkan kelas konteks basis data Data/MvcMovieContext.cs.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<MvcMovie.Models.Movie> Movie { get; set; }
}
}
Kode sebelumnya membuat properti DbSet<Movie> yang mewakili film dalam database.
Injeksi Ketergantungan
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan, seperti konteks database, terdaftar dengan DI di Program.cs. Layanan ini disediakan untuk komponen yang mengharuskannya melalui parameter konstruktor.
Dalam file Controllers/MoviesController.cs, konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks MvcMovieContext basis data ke kontroler. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Perancah menghasilkan kode yang disorot berikut di Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
Sistem konfigurasi ASP.NET Core membaca string koneksi database "MvcMovieContext".
Memeriksa string koneksi database yang dihasilkan
Scaffolding menambahkan string koneksi ke file appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca ConnectionString kunci dari appsettings.json file.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MvcMovie.Migrations
{
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
Dalam kode sebelumnya:
-
InitialCreate.Upmembuat tabel Film dan mengonfigurasiIdsebagai kunci utama. -
InitialCreate.Downmengembalikan perubahan skema yang dilakukan olehUpmigrasi.
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Uji halaman Buat . Masukkan dan kirim data.
Uji halaman Edit, Detail, dan Hapus .
Model bertipe kuat dan direktif @model
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah melewati model yang ditik dengan kuat di MoviesController kelas dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya, https://localhost:5001/movies/details/1 mengatur:
- Pengontrol ke
moviespengontrol, segmen URL pertama. - Tindakan pada segmen URL kedua
details. - Ke
id1, segmen URL terakhir.
id dapat diteruskan dengan string kueri, seperti dalam contoh berikut:
https://localhost:5001/movies/details?id=1
Parameter id didefinisikan sebagai tipe nullable (int?) dalam kasus ketika id nilai tidak disediakan.
Ekspresi lambda diteruskan ke dalam metode FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class = "col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class = "col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model memungkinkan akses ke daftar film yang diberikan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Model Karena objek ditentukan tipe secara kuat sebagai IEnumerable<Movie> objek, setiap item dalam perulangan dianggap bertipe Movie. Di antara manfaat lainnya, kompilator memvalidasi jenis yang digunakan dalam kode.
Sumber daya tambahan
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Models/Movie.cs Perbarui file dengan kode berikut:
using System;
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Menambahkan paket NuGet
Dari menu Alat, pilih NuGet Package Manager>Package Manager Console (PMC).
Di PMC, jalankan perintah berikut:
Install-Package Microsoft.EntityFrameworkCore.Design
Perintah sebelumnya menambahkan:
- Penyedia SQL Server EF Core. Paket dari penyedia menginstal paket EF Core sebagai dependensi.
- Utilitas yang digunakan oleh paket yang diinstal secara otomatis dalam langkah scaffolding, kemudian dalam tutorial.
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat perancah untuk menghasilkan halaman Create, Read, Update, dan Delete (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Pengontrol dan pilih Tambahkan Item Perancah Baru >.
Dalam dialog Tambahkan Perancah, pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework > Tambahkan.
Selesaikan kotak dialog Tambah Pengontrol MVC dengan tampilan, menggunakan Entity Framework:
- Di menu drop-down kelas Model, pilih Movie (MvcMovie.Models).
- Pada baris kelas konteks data, pilih tanda +(plus).
- Dalam dialog Tambahkan Konteks Data, nama kelas MvcMovie.Data.MvcMovieContext dihasilkan.
- Pilih Tambahkan.
- Tampilan dan Nama pengontrol: Pertahankan default.
- Pilih Tambahkan.
Perancah memperbarui hal berikut:
- Menyisipkan referensi paket yang diperlukan dalam file proyek
MvcMovie.csproj. - Mendaftarkan konteks database di bagian
Startup.ConfigureServicesdari fileStartup.cs. - Menambahkan string koneksi database ke file
appsettings.json.
Perancah menyediakan hal berikut:
- Pengontrol film:
Controllers/MoviesController.cs -
Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks :
Views/Movies/*.cshtml - Kelas konteks database:
Data/MvcMovieContext.cs
Pembuatan otomatis file dan pembaruan file ini dikenal sebagai pembentukan kerangka kerja.
Halaman yang telah dirancang belum dapat digunakan karena database belum tersedia. Menjalankan aplikasi dan memilih tautan Movie App menghasilkan pesan kesalahan Tidak dapat membuka database atau tidak ada tabel seperti itu: Movie.
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang membuat dan memperbarui database agar sesuai dengan model data.
Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.
Di Package Manager Console (PMC), masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.
Perintah Update-Database 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 sebelumnya, ini diperbaiki dalam tutorial selanjutnya.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Menguji aplikasi
Jalankan aplikasi dan pilih tautan Aplikasi Film.
Jika Anda mendapatkan pengecualian yang mirip dengan yang berikut ini, Anda mungkin telah melewatkan langkah migrasi:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Note
Anda mungkin tidak dapat memasukkan koma desimal di Price bidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.
Periksa kelas konteks basis data dan pendaftaran yang dihasilkan
Dengan EF Core, akses data dilakukan menggunakan model. Model terdiri dari kelas entitas dan objek konteks yang mewakili sesi dengan database. Objek konteks memungkinkan kueri dan penyimpanan data. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Perancah menghasilkan kelas konteks basis data Data/MvcMovieContext.cs.
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<Movie> Movie { get; set; }
}
}
Kode sebelumnya membuat properti DbSet<Movie> yang mewakili film dalam database.
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan, seperti konteks basis data, harus terdaftar di DI dalam Startup. Komponen yang memerlukan layanan ini disediakan melalui parameter konstruktor.
Dalam file Controllers/MoviesController.cs, konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks MvcMovieContext basis data ke kontroler. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Perancah menghasilkan kode yang disorot berikut di Startup.ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}
Sistem konfigurasi ASP.NET Core membaca string koneksi database "MvcMovieContext".
Memeriksa string koneksi database yang dihasilkan
Scaffolding menambahkan string koneksi ke file appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca ConnectionString kunci dari appsettings.json file.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
Dalam kode sebelumnya:
-
InitialCreate.Upmembuat tabel Film dan mengonfigurasiIdsebagai kunci utama. -
InitialCreate.Downmengembalikan perubahan skema yang dilakukan olehUpmigrasi.
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Uji halaman Buat . Masukkan dan kirim data.
Uji halaman Edit, Detail, dan Hapus .
Model bertipe kuat dan direktif @model
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah melewati model yang ditik dengan kuat di MoviesController kelas dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya, https://localhost:5001/movies/details/1 mengatur:
- Pengontrol ke
moviespengontrol, segmen URL pertama. - Tindakan pada segmen URL kedua
details. - Ke
id1, segmen URL terakhir.
id dapat diteruskan dengan string kueri, seperti dalam contoh berikut:
https://localhost:5001/movies/details?id=1
Parameter id didefinisikan sebagai tipe nullable (int?) dalam kasus ketika id nilai tidak disediakan.
Ekspresi lambda diteruskan ke dalam metode FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model memungkinkan akses ke daftar film yang diberikan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Model Karena objek ditentukan tipe secara kuat sebagai IEnumerable<Movie> objek, setiap item dalam perulangan dianggap bertipe Movie. Di antara manfaat lainnya, kompilator memvalidasi jenis yang digunakan dalam kode.
Pencatatan SQL Kerangka Kerja Entitas Core
Konfigurasi pengelogan biasanya disediakan oleh bagian Logging dari file appsettings.{Environment}.json. Untuk mencatat pernyataan SQL, tambahkan "Microsoft.EntityFrameworkCore.Database.Command": "Information" ke appsettings.Development.json file:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
},
"AllowedHosts": "*"
}
Dengan JSON sebelumnya, pernyataan SQL ditampilkan pada baris perintah dan di jendela output Visual Studio.
Untuk informasi selengkapnya, lihat Pengelogan di .NET dan ASP.NET Core dan masalah GitHub ini.
Sumber daya tambahan
Dalam tutorial ini, kelas ditambahkan untuk mengelola film dalam database. Kelas-kelas ini adalah bagian "Model" dari aplikasi MVC.
Kelas model ini digunakan dengan Entity Framework Core (EF Core) untuk bekerja dengan database. EF Core adalah kerangka kerja pemetaan relasional objek (ORM) yang menyederhanakan kode akses data yang harus Anda tulis.
Kelas model yang dibuat dikenal sebagai kelas POCO, dari Plain Old CLR Objects. Kelas POCO tidak memiliki dependensi pada EF Core. Mereka hanya menentukan properti data yang akan disimpan dalam database.
Dalam tutorial ini, kelas model dibuat terlebih dahulu, dan EF Core membuat database.
Menambahkan kelas model data
Klik kanan folder Models>Tambah>Kelas. Beri nama file Movie.cs.
Movie.cs Perbarui file dengan kode berikut:
using System;
using System.ComponentModel.DataAnnotations;
namespace MvcMovie.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 memiliki kolom Id yang dibutuhkan oleh database untuk kunci utama.
Atribut DataType pada ReleaseDate menentukan jenis data (Date). Dengan atribut ini:
- Pengguna tidak diharuskan memasukkan informasi waktu di bidang tanggal.
- Hanya tanggal yang ditampilkan, bukan informasi waktu.
DataAnnotations dibahas dalam tutorial selanjutnya.
Menambahkan paket NuGet
Dari menu Alat, pilih NuGet Package Manager>Package Manager Console (PMC).
Di PMC, jalankan perintah berikut:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Perintah sebelumnya menambahkan penyedia SQL Server EF Core. Paket dari penyedia menginstal paket EF Core sebagai dependensi. Paket tambahan diinstal secara otomatis di langkah perancah nanti dalam tutorial.
Membuat kelas konteks database
Kelas konteks database diperlukan untuk mengoordinasikan fungsionalitas EF Core (Create, Read, Update, Delete) untuk model Movie. Konteks database berasal dari Microsoft.EntityFrameworkCore.DbContext dan menentukan entitas yang akan disertakan dalam model data.
Buat folder Data.
Data/MvcMovieContext.cs Tambahkan file dengan kode berikut:
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
: base(options)
{
}
public DbSet<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.
Mendaftarkan konteks database
ASP.NET Core dibangun dengan injeksi dependensi (DI). Layanan (seperti EF Core konteks DB) harus didaftarkan dengan DI selama pengaktifan aplikasi. Komponen yang memerlukan layanan ini (seperti Razor Pages) disediakan melalui parameter konstruktor. Kode konstruktor yang mendapatkan instans konteks DB ditampilkan nanti dalam tutorial. Di bagian ini, Anda mendaftarkan konteks database dengan kontainer DI.
Tambahkan pernyataan berikut using di bagian Startup.csatas :
using MvcMovie.Data;
using Microsoft.EntityFrameworkCore;
Tambahkan kode yang disorot berikut di Startup.ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}
Nama string koneksi diteruskan ke konteks dengan memanggil metode pada DbContextOptions objek. Untuk pengembangan lokal, sistem konfigurasi ASP.NET Core membaca string koneksi dari appsettings.json file.
Memeriksa string koneksi database
Tambahkan string koneksi ke appsettings.json file:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Buat proyek sebagai pemeriksaan kesalahan pengkompilasi.
Halaman film Kerangka
Gunakan alat scaffolding untuk menghasilkan halaman Buat, Baca, Perbarui, dan Hapus (CRUD) untuk model film.
Di Penjelajah Solusi, klik kanan pada folder Controllers, lalu > Tambahkan > Item Perancah Baru.
Dalam dialog Tambahkan Perancah, pilih Pengontrol MVC dengan tampilan, menggunakan Entity Framework > Tambahkan.
Selesaikan dialog Tambahkan Pengontrol :
- Kelas model:Movie (MvcMovie.Models)
- Kelas konteks data:MvcMovieContext (MvcMovie.Data)
- Tampilan: Biarkan default setiap opsi tetap dicentang
- Nama pengontrol: Pilih MoviesController default.
- Pilih Tambahkan
Visual Studio membuat:
- Pengontrol film (
Controllers/MoviesController.cs) - Razor lihat file untuk halaman Buat, Hapus, Detail, Edit, dan Indeks (*Views/Movies/'.cshtml')
Pembuatan otomatis file-file ini dikenal sebagai scaffolding.
Anda belum dapat menggunakan halaman yang dihasilkan karena databasenya belum ada. Jika Anda menjalankan aplikasi dan mengklik tautan Aplikasi Film, Anda mendapatkan tidak dapat membuka database atau tidak ada tabel seperti itu: Pesan kesalahan film .
Migrasi awal
EF Core Gunakan fitur Migrasi untuk membuat database. Migrasi adalah sekumpulan alat yang memungkinkan Anda membuat dan memperbarui database agar sesuai dengan model data Anda.
Dari menu Alat, pilih NuGet Package Manager>Package Manager Console (PMC).
Di PMC, masukkan perintah berikut:
Add-Migration InitialCreate
Update-Database
Add-Migration InitialCreate: Menghasilkan file migrasiMigrations/{timestamp}_InitialCreate.cs. ArgumenInitialCreateadalah nama migrasi. Nama apa pun dapat digunakan, tetapi menurut konvensi, nama dipilih yang menjelaskan migrasi. Karena ini adalah migrasi pertama, kelas yang dihasilkan berisi kode untuk membuat skema database. Skema database didasarkan pada model yang ditentukan diMvcMovieContextkelas .Update-Database: Memperbarui database ke migrasi terbaru, yang dibuat oleh perintah sebelumnya. Perintah ini menjalankanUpmetode dalamMigrations/{time-stamp}_InitialCreate.csfile, yang membuat database.Perintah pembaruan database 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()'.
Anda dapat mengabaikan peringatan itu, itu akan diperbaiki dalam tutorial selanjutnya.
Untuk informasi selengkapnya tentang alat PMC untuk EF Core, lihat EF Core referensi alat - PMC di Visual Studio.
Kelas InitialCreate
Periksa Migrations/{timestamp}_InitialCreate.cs file migrasi:
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy",
SqlServerValueGenerationStrategy.IdentityColumn),
Title = table.Column<string>(nullable: true),
ReleaseDate = table.Column<DateTime>(nullable: false),
Genre = table.Column<string>(nullable: true),
Price = table.Column<decimal>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
Metode Up ini membuat tabel Film dan mengonfigurasi Id sebagai kunci utama. Metode ini membatalkan perubahan skema yang dibuat oleh migrasi DownUp.
Menguji aplikasi
Jalankan aplikasi dan klik tautan Movie App.
Jika Anda mendapatkan pengecualian yang mirip dengan salah satu hal berikut ini:
SqlException: Cannot open database "MvcMovieContext-1" requested by the login. The login failed.
Mungkin Anda melewatkan tahap migrasi.
Uji halaman Buat . Masukkan dan kirim data.
Note
Anda mungkin tidak dapat memasukkan koma desimal di
Pricebidang . Untuk agar mendukung validasi jQuery untuk lokal non-Inggris yang menggunakan koma (",") untuk titik desimal dan untuk format tanggal non-Inggris AS, aplikasi harus diglobalisasi. Untuk instruksi globalisasi, lihat masalah GitHub ini.Uji halaman Edit, Detail, dan Hapus .
Injeksi dependensi di pengontrol
Controllers/MoviesController.cs Buka file dan periksa konstruktor:
public class MoviesController : Controller
{
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
Konstruktor menggunakan Injeksi Dependensi untuk menyuntikkan konteks database (MvcMovieContext) ke dalam pengontrol. Konteks database digunakan dalam setiap metode CRUD di pengontrol.
Model yang di ketik dengan kuat dan @model kata kunci
Sebelumnya dalam tutorial ini, Anda melihat bagaimana pengontrol dapat meneruskan data atau objek ke tampilan menggunakan ViewData kamus.
ViewData Kamus adalah objek dinamis yang menyediakan cara late-bound yang nyaman untuk meneruskan informasi ke tampilan.
MVC juga menyediakan kemampuan untuk meneruskan objek model yang ditik dengan kuat ke tampilan. Pendekatan yang sangat ditik ini memungkinkan pemeriksaan kode waktu kompilasi. Mekanisme perancah menggunakan pendekatan ini (yaitu, meneruskan model yang bertipe kuat) dengan kelas MoviesController dan tampilan.
Periksa metode yang dihasilkan Details dalam Controllers/MoviesController.cs file:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Parameter id umumnya diteruskan sebagai data rute. Misalnya https://localhost:5001/movies/details/1 mengatur:
- Pengontrol menuju pengontrol
movies(segmen URL pertama). - Tindakan ke
details(segmen URL kedua). - ID menjadi 1 (segmen terakhir URL).
Anda juga bisa meneruskan id dengan string kueri sebagai berikut:
https://localhost:5001/movies/details?id=1
Parameter id didefinisikan sebagai jenis nullable (int?) jika nilai ID tidak disediakan.
Ekspresi lambda diberikan ke FirstOrDefaultAsync untuk memilih entitas film yang cocok dengan data rute atau nilai string kueri.
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
Jika film ditemukan, objek Movie model diteruskan ke Details tampilan.
return View(movie);
Periksa isi Views/Movies/Details.cshtml file:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<div>
<h4>Movie</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Title)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Title)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.ReleaseDate)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.ReleaseDate)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Genre)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Genre)
</dd>
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Price)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.Price)
</dd>
</dl>
</div>
<div>
<a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
<a asp-action="Index">Back to List</a>
</div>
Pernyataan @model di bagian atas file tampilan menentukan jenis objek yang diharapkan tampilan. Ketika pengontrol film dibuat, pernyataan berikut @model disertakan:
@model MvcMovie.Models.Movie
Arahan @model ini memungkinkan akses ke film yang diteruskan oleh pengontrol ke dalam tampilan. Objek Model dititik dengan kuat. Misalnya, dalam tampilan Details.cshtml, kode meneruskan setiap bidang film ke Helper HTML DisplayNameFor dan DisplayFor dengan objek Model yang bertipe data kuat. Metode Create dan Edit serta tampilan juga meneruskan objek model Movie.
Index.cshtml Periksa tampilan dan Index metode di pengontrol Film. Perhatikan bagaimana kode membuat List objek saat memanggil View metode . Kode meneruskan daftar Movies ini dari metode aksi Index ke tampilan:
// GET: Movies
public async Task<IActionResult> Index()
{
return View(await _context.Movie.ToListAsync());
}
Ketika controller film dibuat, scaffolding menyertakan pernyataan berikut @model di bagian atas file Index.cshtml:
@model IEnumerable<MvcMovie.Models.Movie>
Direktif @model ini memungkinkan Anda mengakses daftar film yang diteruskan oleh pengontrol ke tampilan dengan menggunakan objek Model yang bertipe kuat. Misalnya, dalam Index.cshtml tampilan, kode mengulang melalui film dengan pernyataan di atas objek yang foreach sangat di ketik Model :
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.Price)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
Karena objek Model bertipe kuat (sebagai objek IEnumerable<Movie>), setiap item dalam perulangan bertipe sebagai Movie. Di antara manfaat lainnya, ini berarti Anda mendapatkan pemeriksaan waktu kompilasi kode.
Sumber daya tambahan
ASP.NET Core