Udostępnij za pośrednictwem


Praca z danymi

Wskazówka

Ta zawartość jest fragmentem książki eBook Blazor dla deweloperów formularzy internetowych platformy ASP NET dla platformy Azure, dostępnym na platformie .NET Docs lub jako bezpłatny plik PDF do pobrania, który można odczytać w trybie offline.

Blazor-for-ASP-NET-Web-Forms-Developers eBook cover thumbnail (Miniatura książki eBook for-ASP-NET-Web-Forms-Developers).

Dostęp do danych jest szkieletem aplikacji ASP.NET Web Forms. Co się stanie z danymi, jeśli tworzysz formularze dla sieci Web? W przypadku formularzy sieci Web istnieje wiele technik dostępu do danych, których można użyć do interakcji z bazą danych:

  • Źródła danych
  • ADO.NET
  • Framework Jednostek

Źródła danych to kontrolki, które można umieścić na stronie formularzy sieci Web i skonfigurować tak jak inne kontrolki. Program Visual Studio udostępnił przyjazny zestaw okien dialogowych w celu skonfigurowania i powiązania kontrolek ze stronami formularzy sieci Web. Deweloperzy korzystający z podejścia "niskiego kodu" lub "braku kodu" preferowali tę technikę, gdy formularze Web Forms zostały wydane po raz pierwszy.

Źródła danych

ADO.NET to podejście niskiego poziomu do interakcji z bazą danych. Aplikacje mogą utworzyć połączenie z bazą danych za pomocą poleceń, tabel danych i zestawów danych na potrzeby interakcji. Wyniki można następnie powiązać z polami na ekranie bez dużej ilości kodu. Wadą tego podejścia było to, że każdy zestaw obiektów ADO.NET (Connection, Commandi DataTable) był powiązany z bibliotekami dostarczonymi przez dostawcę bazy danych. Użycie tych składników sprawiło, że kod jest sztywny i trudny do migracji do innej bazy danych.

Framework Jednostek

Entity Framework (EF) to struktura mapowania obiektów typu open source utrzymywana przez program .NET Foundation. Początkowo wprowadzony wraz z .NET Framework, EF umożliwia generowanie kodu dla połączeń baz danych, schematów przechowywania i interakcji. Dzięki tej abstrakcji można skoncentrować się na regułach biznesowych aplikacji i zezwolić na zarządzanie bazą danych przez zaufanego administratora bazy danych. Na platformie .NET można użyć zaktualizowanej wersji programu EF o nazwie EF Core. Program EF Core pomaga w generowaniu i utrzymywaniu interakcji między kodem a bazą danych za pomocą szeregu poleceń, które są dostępne dla Ciebie za pomocą dotnet ef narzędzia wiersza polecenia. Zobaczmy kilka przykładów, które pomogą Ci rozpocząć pracę z bazą danych.

EF Code First

Szybkim sposobem rozpoczęcia tworzenia interakcji z bazą danych jest rozpoczęcie od obiektów klas, z których chcesz pracować. Program EF udostępnia narzędzie ułatwiające generowanie odpowiedniego kodu bazy danych dla klas. Takie podejście jest nazywane programowaniem "Code First". Rozważmy następującą Product klasę dla przykładowej aplikacji sklepu, którą chcemy przechowywać w relacyjnej bazie danych, takiej jak 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; }
}

Produkt ma klucz podstawowy i trzy dodatkowe pola, które zostaną utworzone w naszej bazie danych:

  • Program EF zidentyfikuje Id właściwość jako klucz podstawowy zgodnie z konwencją.
  • Name będzie przechowywany w kolumnie skonfigurowanej do przechowywania tekstu. Atrybut [Required] dekorujący tę właściwość doda not null ograniczenie, aby ułatwić wymuszanie tego zadeklarowanego zachowania właściwości.
  • Description będzie przechowywany w kolumnie skonfigurowanej do przechowywania tekstu i ma maksymalną długość skonfigurowaną 4000 znaków zgodnie z atrybutem [MaxLength] . Schemat bazy danych zostanie skonfigurowany z kolumną o nazwie MaxLength przy użyciu typu varchar(4000)danych .
  • Właściwość Price będzie przechowywana w formie waluty. Atrybut [Range] wygeneruje odpowiednie ograniczenia, aby zapobiec przechowywaniu danych poza zadeklarowanymi wartościami minimalnymi i maksymalnymi.

Musimy dodać tę Product klasę do klasy kontekstu bazy danych, która definiuje operacje połączenia i tłumaczenia z naszą bazą danych.

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

Klasa MyDbContext udostępnia jedną właściwość, która definiuje dostęp i tłumaczenie dla Product klasy. Aplikacja konfiguruje tę klasę pod kątem interakcji z bazą danych przy użyciu następujących wpisów w Startup metodzie klasy ConfigureServices (lub odpowiedniej lokalizacji w Program.cs przy użyciu builder.Services właściwości zamiast services):

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer("MY DATABASE CONNECTION STRING"));

Powyższy kod połączy się z bazą danych programu SQL Server z określonymi parametrami połączenia. Ciąg połączenia można umieścić w pliku appsettings.json, zmiennych środowiskowych lub innych lokalizacjach przechowywania konfiguracji i odpowiednio zastąpić ten osadzony ciąg.

Następnie możesz wygenerować tabelę bazy danych odpowiednią dla tej klasy przy użyciu następujących poleceń:

dotnet ef migrations add 'Create Product table'
dotnet ef database update

Pierwsze polecenie definiuje zmiany wprowadzone w schemacie bazy danych jako nową migrację ef o nazwie Create Product table. Migracja definiuje sposób stosowania i usuwania nowych zmian bazy danych.

Po zastosowaniu masz prostą Product tabelę w bazie danych i kilka nowych klas dodanych do projektu, które ułatwiają zarządzanie schematem bazy danych. Te wygenerowane klasy można znaleźć domyślnie w nowym folderze o nazwie Migrations( Migracje). Po wprowadzeniu zmian w klasie Product lub dodaniu więcej powiązanych klas, które chcesz, aby interagowały z bazą danych, należy ponownie uruchomić polecenia wiersza poleceń z nową nazwą migracji. To polecenie spowoduje wygenerowanie innego zestawu klas migracji w celu zaktualizowania schematu bazy danych.

EF Database First

W przypadku istniejących baz danych można wygenerować klasy dla platformy EF Core przy użyciu narzędzi wiersza polecenia platformy .NET. Aby utworzyć szkielet klas, użyj odmiany następującego polecenia:

dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer

Poprzednie polecenie łączy się z bazą danych przy użyciu określonych parametrów połączenia i dostawcy Microsoft.EntityFrameworkCore.SqlServer . Po nawiązaniu połączenia zostanie utworzona klasa kontekstu bazy danych o nazwie MyDbContext . Ponadto klasy pomocnicze są tworzone dla tabel Product i Customer, które zostały określone z opcje -t. Istnieje wiele opcji konfiguracji dla tego polecenia, aby wygenerować hierarchię klas odpowiednią dla bazy danych. Aby uzyskać pełną dokumentację, zobacz dokumentację polecenia.

Więcej informacji na temat platformy EF Core można znaleźć w witrynie Microsoft Docs.

Interakcja z usługami sieci Web

Po pierwszym wydaniu ASP.NET usługi SOAP były preferowanym sposobem wymiany danych przez serwery internetowe i klientów. Wiele zmieniło się od tego czasu, a preferowane interakcje z usługami zostały przeniesione do bezpośrednich interakcji klienta HTTP. Dzięki ASP.NET Core i Blazor, możesz zarejestrować konfigurację swojego HttpClient w pliku Program.cs lub w metodzie Startup klasy ConfigureServices. Użyj tej konfiguracji, gdy musisz wchodzić w interakcję z punktem końcowym HTTP. Rozważmy następujący kod konfiguracji:

// 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");
});

Za każdym razem, gdy musisz uzyskać dostęp do danych z usługi GitHub, utwórz klienta o nazwie github. Klient jest skonfigurowany przy użyciu adresu podstawowego, a nagłówki żądań są odpowiednio ustawiane. Wstrzyknij IHttpClientFactory do swoich Blazor komponentów za pomocą dyrektywy @inject lub atrybutu [Inject] we właściwości. Utwórz nazwanego klienta i wchodź w interakcję z usługami, używając poniższej składni:

@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();
    }
}

Ta metoda zwraca ciąg opisujący kolekcję problemów w repozytorium dotnet/docs GitHub. Zwraca on zawartość w formacie JSON i jest deserializowany do odpowiednich obiektów problemów z usługą GitHub. Istnieje wiele sposobów konfigurowania obiektu HttpClientFactory w celu dostarczania wstępnie skonfigurowanych HttpClient obiektów. Spróbuj skonfigurować wiele HttpClient wystąpień o różnych nazwach i punktach końcowych dla różnych usług sieciowych, z którymi pracujesz. Podejście to sprawi, że interakcja z tymi usługami na każdej stronie będzie łatwiejsza. Aby uzyskać więcej informacji, zobacz Wysyłanie żądań HTTP przy użyciu IHttpClientFactory.