Freigeben über


Mit Daten arbeiten

Tipp

Diese Inhalte sind ein Auszug aus dem eBook „Blazor for ASP NET Web Forms Developers for Azure“, verfügbar unter .NET Docs oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.

Miniaturansicht des Deckblatts des eBooks „Blazor for ASP NET Web Forms Developers for Azure“.

Der Datenzugriff ist das Rückgrat einer ASP.NET Web Forms-App. Wenn Sie Formulare für das Web erstellen, was geschieht mit diesen Daten? Mit Web Forms gab es mehrere Datenzugriffstechniken, die Sie für die Interaktion mit einer Datenbank verwenden konnten:

  • Datenquellen
  • ADO.NET
  • Entity Framework

Datenquellen waren Steuerelemente, die Sie auf einer Web Forms-Seite platzieren und wie andere Steuerelemente konfigurieren konnten. Visual Studio bietet eine benutzerfreundliche Gruppe von Dialogfeldern zum Konfigurieren und Binden der Steuerelemente an Ihre Web Forms-Seiten. Entwickler, die einen "low code"- oder "no code"-Ansatz genießen, haben diese Technik bevorzugt, als Web Forms zum ersten Mal veröffentlicht wurde.

Datenquellen

ADO.NET ist der Ansatz auf niedriger Ebene für die Interaktion mit einer Datenbank. Ihre Apps könnten eine Verbindung mit der Datenbank mit Befehlen, Datentabellen und Datasets für die Interaktion erstellen. Die Ergebnisse könnten dann ohne viel Code an Felder auf dem Bildschirm gebunden werden. Der Nachteil dieses Ansatzes war, dass jeder Satz von ADO.NET -Objekten (Connection, und Command) an Bibliotheken gebunden wurde, DataTabledie von einem Datenbankanbieter bereitgestellt werden. Die Verwendung dieser Komponenten machte den Code starr und schwierig, zu einer anderen Datenbank zu migrieren.

Entity Framework

Entity Framework (EF) ist das open Source-Objektrelationalzuordnungsframework, das von .NET Foundation verwaltet wird. Ursprünglich mit .NET Framework veröffentlicht, ermöglicht EF das Generieren von Code für die Datenbankverbindungen, Speicherschemas und Interaktionen. Mit dieser Abstraktion können Sie sich auf die Geschäftsregeln Ihrer App konzentrieren und zulassen, dass die Datenbank von einem vertrauenswürdigen Datenbankadministrator verwaltet wird. In .NET können Sie eine aktualisierte Version von EF Core verwenden. EF Core hilft beim Generieren und Verwalten der Interaktionen zwischen Ihrem Code und der Datenbank mit einer Reihe von Befehlen, die für Sie mit dem dotnet ef Befehlszeilentool verfügbar sind. Sehen wir uns ein paar Beispiele an, damit Sie den Umgang mit einer Datenbank üben können.

Code-First-Ansatz in EF

Eine schnelle Möglichkeit zum Erstellen Ihrer Datenbankinteraktionen besteht darin, mit den Klassenobjekten zu beginnen, mit der Sie arbeiten möchten. EF stellt ein Tool bereit, mit dem Sie den entsprechenden Datenbankcode für Ihre Klassen generieren können. Dieser Ansatz wird als "Code First"-Entwicklung bezeichnet. Betrachten Sie die folgende Product Klasse für eine Beispiel-Storefront-App, die wir in einer relationalen Datenbank wie Microsoft SQL Server speichern möchten.

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; }
}

Das Produkt verfügt über einen Primärschlüssel und drei zusätzliche Felder, die in unserer Datenbank erstellt werden würden:

  • EF identifiziert die Id Eigenschaft als Primärschlüssel nach Konvention.
  • Name wird in einer Spalte gespeichert, die für die Textspeicherung konfiguriert ist. Das [Required] Attribut, das diese Eigenschaft angibt, fügt eine not null Einschränkung hinzu, um dieses deklarierte Verhalten der Eigenschaft zu erzwingen.
  • Description wird in einer Spalte gespeichert, die für die Textspeicherung konfiguriert ist, und hat eine gemäß dem [MaxLength] Attribut konfigurierte maximale Länge von 4000 Zeichen. Das Datenbankschema wird mit einer Spalte namens MaxLength und dem Datentyp varchar(4000) konfiguriert.
  • Die Price Eigenschaft wird als Währung gespeichert. Das [Range] Attribut generiert geeignete Einschränkungen, um die Datenspeicherung außerhalb der deklarierten Mindest- und Höchstwerte zu verhindern.

Wir müssen diese Product Klasse einer Datenbankkontextklasse hinzufügen, die die Verbindungs- und Übersetzungsvorgänge mit unserer Datenbank definiert.

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

Die MyDbContext Klasse stellt die eine Eigenschaft bereit, die den Zugriff und die Übersetzung für die Product Klasse definiert. Ihre Anwendung konfiguriert diese Klasse für die Interaktion mit der Datenbank mithilfe der folgenden Einträge in der Methode Startup der ConfigureServices Klasse (oder an einem geeigneten Ort in Program.cs unter Verwendung der builder.Services Eigenschaft anstelle von services):

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

Der vorangehende Code stellt eine Verbindung mit einer SQL Server-Datenbank mit der angegebenen Verbindungszeichenfolge her. Sie können die Verbindungszeichenfolge in Ihrer appsettings.json Datei, Umgebungsvariablen oder anderen Konfigurationsspeicherorten platzieren und diese eingebettete Zeichenfolge entsprechend ersetzen.

Anschließend können Sie die datenbanktabelle generieren, die für diese Klasse geeignet ist, indem Sie die folgenden Befehle verwenden:

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

Der erste Befehl definiert die Änderungen, die Sie am Datenbankschema vornehmen, als neue EF-Migration namens .The first command defines the changes you're making to the database schema as a new EF Migration called Create Product table. Eine Migration definiert, wie Ihre neuen Datenbankänderungen angewendet und entfernt werden.

Nach der Anwendung verfügen Sie über eine einfache Product Tabelle in Ihrer Datenbank und einige neue Klassen, die dem Projekt hinzugefügt werden, mit denen das Datenbankschema verwaltet werden kann. Sie finden diese generierten Klassen standardmäßig in einem neuen Ordner namens "Migrationen". Wenn Sie Änderungen an der Product Klasse vornehmen oder weitere verwandte Klassen hinzufügen, die Sie mit Ihrer Datenbank interagieren möchten, müssen Sie die Befehlszeilenbefehle erneut mit einem neuen Namen der Migration ausführen. Mit diesem Befehl wird ein weiterer Satz von Migrationsklassen generiert, um Das Datenbankschema zu aktualisieren.

EF-Datenbank zuerst

Für vorhandene Datenbanken können Sie die Klassen für EF Core mithilfe der .NET-Befehlszeilentools generieren. Verwenden Sie zum Gerüst der Klassen eine Variation des folgenden Befehls:

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

Mit dem vorherigen Befehl wird eine Verbindung mit der Datenbank mithilfe der angegebenen Verbindungszeichenfolge und des Microsoft.EntityFrameworkCore.SqlServer Anbieters hergestellt. Nach der Verbindung wird eine Datenbankkontextklasse MyDbContext erstellt. Darüber hinaus werden unterstützende Klassen für die Product und Customer Tabellen erstellt, die mit den -t Optionen angegeben wurden. Für diesen Befehl gibt es viele Konfigurationsoptionen, um die klassenhierarchie zu generieren, die für Ihre Datenbank geeignet ist. Eine vollständige Referenz finden Sie in der Dokumentation des Befehls.

Weitere Informationen zu EF Core finden Sie auf der Microsoft Docs-Website.

Mit Webdiensten interagieren

Als ASP.NET zum ersten Mal veröffentlicht wurde, waren SOAP-Dienste die bevorzugte Möglichkeit für Webserver und Clients, Daten auszutauschen. Seit dieser Zeit hat sich viel geändert, und die bevorzugten Interaktionen mit Diensten wurden auf direkte HTTP-Clientinteraktionen umgestellt. Mit ASP.NET Core und Blazor können Sie die Konfiguration für HttpClient in Program.cs oder in der Startup-Methode der Klasse ConfigureServices registrieren. Verwenden Sie diese Konfiguration, wenn Sie mit dem HTTP-Endpunkt interagieren müssen. Berücksichtigen Sie den folgenden Konfigurationscode:

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

Wenn Sie auf Daten von GitHub zugreifen müssen, erstellen Sie einen Client mit einem Namen von github. Der Client ist mit der Basisadresse konfiguriert, und die Anforderungsheader werden entsprechend festgelegt. Injizieren Sie IHttpClientFactory in Ihre Blazor-Komponenten mit der @inject-Direktive oder einem [Inject]-Attribut auf einer Eigenschaft. Erstellen Sie Ihren benannten Client, und interagieren Sie mit Diensten mithilfe der folgenden 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();
    }
}

Diese Methode gibt die Zeichenfolge zurück, die die Auflistung von Problemen im GitHub-Repository dotnet/docs beschreibt. Es gibt Inhalte im JSON-Format zurück und deserialisiert diese in entsprechende GitHub-Issue-Objekte. Es gibt viele Möglichkeiten, die HttpClientFactory zur Bereitstellung vorkonfigurierter HttpClient Objekte zu konfigurieren. Versuchen Sie, mehrere HttpClient Instanzen mit unterschiedlichen Namen und Endpunkten für die verschiedenen Webdienste zu konfigurieren, mit der Sie arbeiten. Dieser Ansatz wird Ihre Interaktionen mit diesen Diensten auf jeder Seite leichter handhabbar machen. Weitere Informationen finden Sie unter "Durchführen von HTTP-Anforderungen mithilfe von IHttpClientFactory".