ASP.NET Core Blazor s Entity Framework Core (EF Core)
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Tento článek vysvětluje, jak používat Entity Framework Core (EF Core) v serverových Blazor aplikacích.
Na straně Blazor serveru je stavová aplikační architektura. Aplikace udržuje trvalé připojení k serveru a stav uživatele se uchovává v paměti serveru v okruhu. Jedním z příkladů stavu uživatele jsou data uložená v instancích služby injektáže závislostí (DI), které jsou vymezeny na okruh. Jedinečný aplikační model, který Blazor poskytuje, vyžaduje speciální přístup k používání Entity Framework Core.
Poznámka:
Tento článek se zabývá EF Core aplikacemi na straně Blazor serveru. Blazor WebAssembly aplikace běží v sandboxu WebAssembly, který brání většině přímých databázových připojení. EF Core Spuštění Blazor WebAssembly je nad rámec tohoto článku.
Tyto pokyny platí pro komponenty, které přijímají interaktivní vykreslování na straně serveru (interaktivní SSR) v systému Blazor Web App.
Tyto pokyny platí pro Server
projekt hostovaného Blazor WebAssembly řešení nebo Blazor Server aplikace.
Zabezpečený tok ověřování vyžadovaný pro produkční aplikace
Tento článek se týká použití místní databáze, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazenýchtestovacích BlazorBlazorIdentity
Pro služby Microsoft Azure doporučujeme používat spravované identity. Spravované identity se bezpečně ověřují ve službách Azure bez uložení přihlašovacích údajů v kódu aplikace. Další informace naleznete v následujících zdrojích:
- Co jsou spravované identity pro prostředky Azure? (Dokumentace k Microsoft Entra)
- Dokumentace ke službám Azure
Kurz vytvoření Blazor aplikace pro filmovou databázi
Pro výukový zážitek při vytváření aplikace, která používá EF Core pro databázové operace, si prohlédněte Vytvoření aplikace Blazor filmové databáze (Přehled). V tomto kurzu se dozvíte, jak vytvořit Blazor Web App video, které může zobrazovat a spravovat filmy v databázi filmů.
Přístup k databázi
EF Corespoléhá na způsob DbContextkonfigurace přístupu k databázi a funguje jako jednotka práce. EF Core AddDbContext poskytuje rozšíření pro aplikace ASP.NET Core, které registrují kontext jako vymezenou službu. V aplikacích na straně Blazor serveru můžou být registrace vymezených služeb problematické, protože instance se sdílí mezi komponentami v okruhu uživatele. DbContext není bezpečné vlákno a není navržené pro souběžné použití. Stávající životnosti jsou nevhodné z těchto důvodů:
- Singleton sdílí stav napříč všemi uživateli aplikace a vede k nevhodnému souběžnému použití.
- Obor (výchozí) představuje podobný problém mezi komponentami pro stejného uživatele.
- Přechodné výsledky v nové instanci na požadavek, ale vzhledem k tomu, že komponenty mohou být dlouhodobé, výsledkem je delší kontext, než může být zamýšleno.
Následující doporučení jsou navržená tak, aby poskytovala konzistentní přístup k používání EF Core v aplikacích na straně Blazor serveru.
Zvažte použití jednoho kontextu pro každou operaci. Kontext je navržený pro rychlé vytváření instancí s nízkou režií:
using var context = new ProductsDatabaseContext(); return await context.Products.ToListAsync();
Pokud chcete zabránit více souběžným operacím, použijte příznak:
if (Loading) { return; } try { Loading = true; ... } finally { Loading = false; }
Umístěte databázové operace za řádek
Loading = true;
do blokutry
.Zabezpečení vláken není problém, takže logika načítání nevyžaduje uzamčení záznamů databáze. Logika načítání se používá k zakázání ovládacích prvků uživatelského rozhraní, aby uživatelé neúmyslně nevybírejli tlačítka nebo aktualizovali pole při načítání dat.
Pokud existuje nějaká šance, že více vláken může přistupovat ke stejnému bloku kódu, vkněte továrnu a vytvořte novou instanci na operaci. V opačném případě je vkládání a používání kontextu obvykle dostatečné.
U delších EF Coreoperací, které využívají sledování změn nebo řízení souběžnosti, rozsah kontextu na dobu životnosti komponenty.
Nové DbContext
instance
Nejrychlejší způsob, jak vytvořit novou DbContext instanci, je použití new
k vytvoření nové instance. Existují však scénáře, které vyžadují překlad dalších závislostí:
- Použití
DbContextOptions
ke konfiguraci kontextu. - Použití připojovací řetězec podle DbContext, například při použití Identity ASP.NET Core. Další informace najdete v tématu Víceklientská architektura (EF Core dokumentace).
Upozorňující
Neukládejte tajné kódy aplikací, připojovací řetězec, přihlašovací údaje, hesla, osobní identifikační čísla (PIN), privátní kód C#/.NET nebo privátní klíče/tokeny v kódu na straně klienta, což je vždy nezabezpečené. V testovacích a pracovních a produkčních prostředích by kód na straně Blazor serveru a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají údržbě přihlašovacích údajů v kódu projektu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace najdete v tématu Bezpečné udržování citlivých dat a přihlašovacích údajů.
Doporučeným přístupem k vytvoření nové DbContext se závislostmi je použití továrny. EF Core 5.0 nebo novější poskytuje integrovanou továrnu pro vytváření nových kontextů.
Ve verzích rozhraní .NET starších než 5.0 použijte následující 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);
}
}
V předchozí továrně:
- ActivatorUtilities.CreateInstance splňuje všechny závislosti prostřednictvím poskytovatele služeb.
- IDbContextFactory<TContext> je k dispozici v EF Core ASP.NET Core 5.0 nebo novějším, takže předchozí rozhraní se vyžaduje jenom pro ASP.NET Core 3.x.
Následující příklad nakonfiguruje SQLite a povolí protokolování dat v aplikaci, která spravuje kontakty. Kód používá metodu rozšíření (AddDbContextFactory) ke konfiguraci databázové továrny pro DI a poskytnutí výchozích možností:
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"));
Továrna je vkládána do komponent, aby vytvářela nové instance DbContext.
Omezit rozsah kontextu databáze pro metodu komponenty
Továrna se vloží do komponenty:
@inject IDbContextFactory<ContactContext> DbFactory
Vytvořte DbContext pro metodu pomocí továrny (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();
}
}
}
Určení rozsahu kontextu databáze na dobu životnosti komponenty
Možná budete chtít vytvořit DbContext , která existuje po celou dobu životnosti komponenty. Můžete ho používat jako jednotku práce a využívat integrované funkce, jako je sledování změn a řešení souběžnosti.
Implementujte IDisposable a vložte objekt pro vytváření do komponenty:
@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory
Vytvořte vlastnost pro DbContext:
private ContactContext? Context { get; set; }
OnInitializedAsync
se přepíše a vytvoří DbContext:
protected override async Task OnInitializedAsync()
{
Context = DbFactory.CreateDbContext();
}
DbContext se likviduje, když je komponenta likvidována.
public void Dispose() => Context?.Dispose();
Povolení protokolování citlivých dat
EnableSensitiveDataLogging zahrnuje data aplikací ve zprávách výjimek a protokolování architektury. Protokolovaná data můžou zahrnovat hodnoty přiřazené vlastnostem instancí entit a hodnot parametrů pro příkazy odeslané do databáze. Protokolování dat s bezpečnostními EnableSensitiveDataLogging, protože může vystavit hesla a další identifikovatelné osobní údaje (PII), když protokoluje příkazy SQL spuštěné v databázi.
Doporučujeme povolit EnableSensitiveDataLogging pouze vývoj a testování:
#if DEBUG
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"));
#endif