Dela via


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.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail.

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.

Data Sources

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, Commandoch 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 en not 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 namnet MaxLength med datatypen varchar(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 servicesfö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.