Arbeta med data
Dricks
Det här innehållet är ett utdrag ur e-boken, Blazor för ASP NET Web Forms Developers for Azure, tillgängligt på .NET Docs eller som en kostnadsfri nedladdningsbar PDF som kan läsas offline.
Dataåtkomst är ryggraden i en ASP.NET Web Forms-app. Vad händer med dessa data om du skapar formulär för webben? Med Web Forms fanns det flera dataåtkomsttekniker som du kan använda för att interagera med en databas:
- Datakällor
- ADO.NET
- Entity Framework
Datakällor var kontroller som du kunde placera på en webbformulärsida och konfigurera som andra kontroller. Visual Studio tillhandahöll en egen uppsättning dialogrutor för att konfigurera och binda kontrollerna till dina webbformulärsidor. Utvecklare som har en "låg kod" eller "ingen kod"-metod föredrog den här tekniken när Web Forms först släpptes.
ADO.NET är en lågnivåmetod för att interagera med en databas. Dina appar kan skapa en anslutning till databasen med kommandon, datatabeller och datauppsättningar för interaktion. Resultatet kan sedan bindas till fält på skärmen utan mycket kod. Nackdelen med den här metoden var att varje uppsättning ADO.NET objekt (Connection
, Command
och DataTable
) var bundna till bibliotek som tillhandahålls av en databasleverantör. Användningen av dessa komponenter gjorde koden stel och svår att migrera till en annan databas.
Entity Framework
Entity Framework (EF) är det öppen källkod ramverk för objektrelationsmappning som underhålls av .NET Foundation. Ef släpptes ursprungligen med .NET Framework och gör det möjligt att generera kod för databasanslutningar, lagringsscheman och interaktioner. Med den här abstraktionen kan du fokusera på appens affärsregler och låta databasen hanteras av en betrodd databasadministratör. I .NET kan du använda en uppdaterad version av EF med namnet EF Core. EF Core hjälper till att generera och underhålla interaktionerna mellan din kod och databasen med en serie kommandon som är tillgängliga för dig med hjälp av dotnet ef
kommandoradsverktyget. Låt oss ta en titt på några exempel för att få dig att arbeta med en databas.
EF-kod först
Ett snabbt sätt att komma igång med att skapa dina databasinteraktioner är att börja med de klassobjekt som du vill arbeta med. EF tillhandahåller ett verktyg för att generera lämplig databaskod för dina klasser. Den här metoden kallas "Code First"-utveckling. Överväg följande Product
klass för en exempelbutiksapp som vi vill lagra i en relationsdatabas som Microsoft SQL Server.
public class Product
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[MaxLength(4000)]
public string Description { get; set; }
[Range(0, 99999,99)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
}
Produkten har en primärnyckel och ytterligare tre fält som skulle skapas i vår databas:
- EF identifierar egenskapen
Id
som en primärnyckel enligt konventionen. Name
lagras i en kolumn som konfigurerats för textlagring. Attributet[Required]
som dekorerar den här egenskapen lägger till ennot null
begränsning för att framtvinga det här deklarerade beteendet för egenskapen.Description
lagras i en kolumn som konfigurerats för textlagring och har en maximal längd på 4 000 tecken enligt attributet[MaxLength]
. Databasschemat konfigureras med en kolumn med namnetMaxLength
med datatypenvarchar(4000)
.- Egenskapen
Price
lagras som valuta. Attributet[Range]
genererar lämpliga begränsningar för att förhindra datalagring utanför de lägsta och högsta värden som deklareras.
Vi måste lägga till den här Product
klassen i en databaskontextklass som definierar anslutnings- och översättningsåtgärderna med vår databas.
public class MyDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
Klassen MyDbContext
tillhandahåller den enda egenskap som definierar åtkomst och översättning för Product
klassen. Ditt program konfigurerar den här klassen för interaktion med databasen med hjälp av services
följande poster i Startup
klassens ConfigureServices
metod (eller lämplig plats i Program.cs med egenskapen builder.Services
i stället för ):
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer("MY DATABASE CONNECTION STRING"));
Föregående kod ansluter till en SQL Server-databas med den angivna anslutningssträng. Du kan placera anslutningssträng i din appsettings.json-fil, miljövariabler eller andra lagringsplatser för konfiguration och ersätta den här inbäddade strängen på rätt sätt.
Du kan sedan generera databastabellen som är lämplig för den här klassen med hjälp av följande kommandon:
dotnet ef migrations add 'Create Product table'
dotnet ef database update
Det första kommandot definierar de ändringar du gör i databasschemat som en ny EF-migrering med namnet Create Product table
. En migrering definierar hur du tillämpar och tar bort dina nya databasändringar.
När den har tillämpats har du en enkel Product
tabell i databasen och några nya klasser har lagts till i projektet som hjälper dig att hantera databasschemat. Du hittar som standard dessa genererade klasser i en ny mapp med namnet Migreringar. När du gör ändringar i Product
klassen eller lägger till fler relaterade klasser som du vill interagera med databasen måste du köra kommandoradskommandona igen med ett nytt namn på migreringen. Det här kommandot genererar en annan uppsättning migreringsklasser för att uppdatera databasschemat.
EF Database First
För befintliga databaser kan du generera klasserna för EF Core med hjälp av .NET-kommandoradsverktygen. Om du vill skapa en kod för klasserna använder du en variant av följande kommando:
dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer
Föregående kommando ansluter till databasen med den angivna anslutningssträng och providernMicrosoft.EntityFrameworkCore.SqlServer
. När den är ansluten skapas en databaskontextklass med namnet MyDbContext
. Dessutom skapas stödklasser för tabellerna Product
och Customer
som har angetts med -t
alternativen. Det finns många konfigurationsalternativ för det här kommandot för att generera den klasshierarki som är lämplig för databasen. En fullständig referens finns i kommandots dokumentation.
Mer information om EF Core finns på Microsoft Docs-webbplatsen.
Interagera med webbtjänster
När ASP.NET först släpptes var SOAP-tjänster det bästa sättet för webbservrar och klienter att utbyta data. Mycket har ändrats sedan dess och de föredragna interaktionerna med tjänster har övergått till direkta HTTP-klientinteraktioner. Med ASP.NET Core och Blazorkan du registrera konfigurationen av din HttpClient
i Program.cs eller i Startup
klassens ConfigureServices
metod. Använd den konfigurationen när du behöver interagera med HTTP-slutpunkten. Överväg följande konfigurationskod:
// in Program.cs
builder.Services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("http://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent", "BlazorWebForms-Sample");
});
När du behöver komma åt data från GitHub skapar du en klient med namnet github
. Klienten konfigureras med basadressen och begärandehuvudena anges på rätt sätt. IHttpClientFactory
Mata in i komponenterna Blazor @inject
med direktivet eller ett [Inject]
attribut på en egenskap. Skapa din namngivna klient och interagera med tjänster med hjälp av följande syntax:
@inject IHttpClientFactory factory
...
@code {
protected override async Task OnInitializedAsync()
{
var client = factory.CreateClient("github");
var response = await client.GetAsync("repos/dotnet/docs/issues");
response.EnsureStatusCode();
var content = await response.Content.ReadAsStringAsync();
}
}
Den här metoden returnerar strängen som beskriver samlingen av problem på GitHub-lagringsplatsen dotnet/docs . Det returnerar innehåll i JSON-format och deserialiseras till lämpliga GitHub-problemobjekt. Det finns många sätt som du kan konfigurera HttpClientFactory
för att leverera förkonfigurerade HttpClient
objekt. Prova att konfigurera flera HttpClient
instanser med olika namn och slutpunkter för de olika webbtjänster som du arbetar med. Den här metoden gör dina interaktioner med dessa tjänster enklare att arbeta med på varje sida. Mer information finns i Göra HTTP-begäranden med IHttpClientFactory.