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.
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 10 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 9 dari artikel ini.
Artikel ini menjelaskan cara menggunakan Entity Framework Core (EF Core) di aplikasi sisi Blazor server.
Sisi server Blazor adalah kerangka kerja aplikasi stateful. Aplikasi ini mempertahankan koneksi berkelanjutan ke server, dan status pengguna disimpan dalam memori server di sirkuit. Salah satu contoh status pengguna adalah data yang disimpan dalam instans layanan injeksi dependensi (DI) yang tercakup ke sirkuit. Model aplikasi unik yang Blazor menyediakan memerlukan pendekatan khusus untuk menggunakan Entity Framework Core.
Catatan
Artikel ini membahas EF Core di aplikasi sisi Blazor server. Blazor WebAssembly aplikasi berjalan di kotak pasir WebAssembly yang mencegah sebagian besar koneksi database langsung. Menjalankan EF Core di Blazor WebAssembly luar cakupan artikel ini.
Panduan ini berlaku untuk komponen yang mengadopsi penyajian sisi server interaktif (SSR interaktif) dalam Blazor Web App.
Panduan ini berlaku untuk Server proyek solusi atau aplikasi yang Blazor WebAssembly dihostingBlazor Server.
Alur autentikasi aman diperlukan untuk aplikasi produksi
Artikel ini berkaitan dengan penggunaan database lokal yang tidak memerlukan autentikasi pengguna. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi Blazor yang disebarkan, lihat artikel di BlazorKeamanan dan Identity simpul.
Untuk layanan Microsoft Azure, sebaiknya gunakan identitas terkelola. Identitas terkelola mengautentikasi dengan aman ke layanan Azure tanpa menyimpan kredensial dalam kode aplikasi. Untuk informasi selengkapnya, lihat sumber daya berikut:
- Apa identitas terkelola untuk sumber daya Azure? (Dokumentasi Microsoft Entra)
- Dokumentasi layanan Azure
Membuat Blazor tutorial aplikasi database film
Untuk pengalaman tutorial membangun aplikasi yang menggunakan EF Core untuk operasi database, lihat Membuat aplikasi database film Blazor (Gambaran Umum). Tutorial ini menunjukkan kepada Anda cara membuat Blazor Web App yang dapat menampilkan dan mengelola film dalam database film.
Akses Database
EF Core bergantung pada DbContext sebagai sarana untuk mengonfigurasi akses database dan bertindak sebagai unit kerja. EF Core AddDbContext menyediakan ekstensi untuk aplikasi ASP.NET Core yang mendaftarkan konteks sebagai layanan terlingkup. Di aplikasi sisi Blazor server, pendaftaran layanan terlingkup dapat bermasalah karena instans dibagikan di seluruh komponen dalam sirkuit pengguna. DbContext tidak aman utas dan tidak dirancang untuk penggunaan bersamaan. Masa pakai yang ada tidak pantas karena alasan ini:
- Status berbagi Singleton di semua pengguna aplikasi dan mengarah ke penggunaan bersamaan yang tidak tepat.
- Cakupan (default) menimbulkan masalah serupa antara komponen untuk pengguna yang sama.
- Hasil sementara dalam instans baru per permintaan; tetapi karena komponen dapat berumur panjang, ini menghasilkan konteks berumur lebih lama dari yang mungkin dimaksudkan.
Rekomendasi berikut dirancang untuk memberikan pendekatan yang konsisten untuk digunakan EF Core di aplikasi sisi Blazor server.
Pertimbangkan untuk menggunakan satu konteks per operasi. Konteks dirancang untuk instans overhead yang cepat dan rendah:
using var context = new ProductsDatabaseContext(); return await context.Products.ToListAsync();Gunakan bendera untuk mencegah beberapa operasi bersamaan:
if (Loading) { return; } try { Loading = true; ... } finally { Loading = false; }Tempatkan operasi database setelah baris
Loading = true;di bloktry.Keamanan utas tidak menjadi perhatian, jadi memuat logika tidak memerlukan penguncian rekaman database. Logika pemuatan digunakan untuk menonaktifkan kontrol UI sehingga pengguna tidak secara tidak sengaja memilih tombol atau memperbarui bidang saat data diambil.
Jika ada kemungkinan bahwa beberapa utas dapat mengakses blok kode yang sama, menyuntikkan pabrik dan membuat instans baru per operasi. Jika tidak, menyuntikkan dan menggunakan konteks biasanya cukup.
Untuk operasi berumur lebih lama yang memanfaatkan EF Corekontrol pelacakan perubahan atau konkurensi, cakupan konteks hingga masa pakai komponen.
Instans baru DbContext
Cara tercepat untuk membuat instans baru DbContext adalah dengan menggunakan new untuk membuat instans baru. Namun, ada skenario yang memerlukan penyelesaian dependensi tambahan:
- Menggunakan
DbContextOptionsuntuk mengonfigurasi konteks. - Menggunakan string koneksi per DbContext, seperti saat Anda menggunakan Identity ASP.NET Core. Untuk informasi selengkapnya, lihat Multi-penyewaan (EF Core dokumentasi).
Peringatan
Jangan menyimpan rahasia aplikasi, string koneksi, kredensial, kata sandi, nomor identifikasi pribadi (PIN), kode C#/.NET privat, atau kunci/token privat dalam kode sisi klien, yang selalu tidak aman. Di lingkungan pengujian/penahapan dan produksi, kode sisi Blazor server dan API web harus menggunakan alur autentikasi aman yang menghindari mempertahankan kredensial dalam kode proyek atau file konfigurasi. Di luar pengujian pengembangan lokal, sebaiknya hindari penggunaan variabel lingkungan untuk menyimpan data sensitif, karena variabel lingkungan bukanlah pendekatan yang paling aman. Untuk pengujian pengembangan lokal, alat Secret Manager direkomendasikan untuk mengamankan data sensitif. Untuk informasi selengkapnya, lihat Mempertahankan data dan kredensial sensitif dengan aman.
Pendekatan yang direkomendasikan untuk membuat baru DbContext dengan dependensi adalah dengan menggunakan pabrik. EF Core di .NET 5 atau yang lebih baru menyediakan fasilitas bawaan untuk membuat konteks baru.
Dalam versi .NET sebelum .NET 5, gunakan berikut ini DbContextFactory:
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace BlazorServerDbContextExample.Data
{
public class DbContextFactory<TContext>
: IDbContextFactory<TContext> where TContext : DbContext
{
private readonly IServiceProvider provider;
public DbContextFactory(IServiceProvider provider)
{
this.provider = provider ?? throw new ArgumentNullException(
$"{nameof(provider)}: You must configure an instance of " +
"IServiceProvider");
}
public TContext CreateDbContext() =>
ActivatorUtilities.CreateInstance<TContext>(provider);
}
}
Di pabrik sebelumnya:
- ActivatorUtilities.CreateInstance memenuhi dependensi apa pun melalui penyedia layanan.
- IDbContextFactory<TContext> tersedia di EF Core .NET 5 atau yang lebih baru, sehingga antarmuka sebelumnya hanya diperlukan untuk ASP.NET Core 3.x.
Contoh berikut mengonfigurasi SQLite dan mengaktifkan pengelogan data di aplikasi yang mengelola kontak. Kode menggunakan metode ekstensi (AddDbContextFactory) untuk mengonfigurasi pabrik database untuk DI dan menyediakan opsi default:
builder.Services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
Pabrik diinisialisasi ke dalam komponen untuk membuat instance DbContext baru.
Tentukan cakupan konteks database pada metode komponen
Fabrikasi dimasukkan ke dalam komponen:
@inject IDbContextFactory<ContactContext> DbFactory
Buat DbContext untuk metode menggunakan pabrik (DbFactory):
private async Task DeleteContactAsync()
{
using var context = DbFactory.CreateDbContext();
if (context.Contacts is not null)
{
var contact = await context.Contacts.FirstAsync(...);
if (contact is not null)
{
context.Contacts?.Remove(contact);
await context.SaveChangesAsync();
}
}
}
Cakupan konteks database ke masa pakai komponen
Anda mungkin ingin membuat DbContext yang ada selama masa pakai komponen. Ini memungkinkan Anda untuk menggunakannya sebagai unit kerja dan memanfaatkan fitur bawaan, seperti pelacakan perubahan dan resolusi konkurensi.
Terapkan IDisposable dan masukkan faktori ke dalam komponen:
@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory
Buat properti untuk DbContext:
private ContactContext? Context { get; set; }
OnInitializedAsync digantikan untuk membuat DbContext:
protected override async Task OnInitializedAsync()
{
Context = DbFactory.CreateDbContext();
}
DbContext dibuang ketika komponen dibuang:
public void Dispose() => Context?.Dispose();
Mengaktifkan pengelogan data sensitif
EnableSensitiveDataLogging menyertakan data aplikasi dalam pesan pengecualian dan pengelogan kerangka kerja. Data yang dicatat dapat menyertakan nilai yang ditetapkan ke properti instans entitas dan nilai parameter untuk perintah yang dikirim ke database. Data pengelogan dengan EnableSensitiveDataLogging adalah risiko keamanan, karena dapat mengekspos kata sandi dan Informasi Pengidentifikasi Pribadi (PII) lainnya ketika mencatat pernyataan SQL yang dijalankan terhadap database.
Sebaiknya hanya mengaktifkan EnableSensitiveDataLogging untuk pengembangan dan pengujian lokal:
if (builder.Environment.IsDevelopment())
{
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db")
.EnableSensitiveDataLogging());
}
else
{
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
}
Sumber Daya Tambahan:
ASP.NET Core