Praca z danymi
Napiwek
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.
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
- Entity Framework
Ź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.
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
, Command
i 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.
Entity Framework
Entity Framework (EF) to struktura mapowania obiektów typu open source utrzymywana przez program .NET Foundation. Początkowo wydano program .NET Framework, program EF umożliwia generowanie kodu dla połączeń bazy danych, schematów magazynu 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. Przyjrzyjmy się kilku przykładom, aby pracować 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ść dodanot 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 nazwieMaxLength
przy użyciu typuvarchar(4000)
danych .- Właściwość
Price
będzie przechowywana jako waluta. 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ślonym parametry połączenia. Możesz umieścić parametry połączenia w pliku appsettings.json, zmiennych środowiskowych lub innych lokalizacjach magazynu 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 lub dodaniu większej Product
liczby powiązanych klas, które mają współdziałać z bazą danych, należy ponownie uruchomić polecenia wiersza polecenia 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ślonego parametry połączenia i dostawcyMicrosoft.EntityFrameworkCore.SqlServer
. Po nawiązaniu połączenia zostanie utworzona klasa kontekstu bazy danych o nazwie MyDbContext
. Ponadto klasy pomocnicze są tworzone dla Product
tabel i Customer
, które zostały określone z -t
opcjami. 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. Za pomocą ASP.NET Core i Blazor, można zarejestrować konfigurację w HttpClient
Program.cs lub w metodzie Startup
ConfigureServices
klasy. 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. Wstrzykiwanie elementu IHttpClientFactory
do Blazor składników za pomocą @inject
dyrektywy lub [Inject]
atrybutu we właściwości. Utwórz nazwanego klienta i wchodzenie w interakcję z usługami przy użyciu następującej 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 internetowych, z których pracujesz. Takie podejście ułatwi interakcję z tymi usługami na każdej stronie. Aby uzyskać więcej informacji, zobacz Make HTTP requests using IHttpClientFactory (Żądania HTTP przy użyciu elementu IHttpClientFactory).