Utilisation des données
Conseil
Ce contenu est un extrait du livre électronique, Blazor pour les développeurs ASP NET Web Forms pour Azure, disponible dans la documentation .NET ou au format PDF à télécharger gratuitement pour le lire hors connexion.
L’accès aux données est l’épine dorsale d’une application ASP.NET Web Forms. Si vous créez des formulaires pour le web, qu’advient-il de ces données ? Avec Web Forms, il existe plusieurs techniques d’accès aux données que vous pouvez utiliser pour interagir avec une base de données :
- Data Sources
- ADO.NET
- Entity Framework
Les sources de données étaient des contrôles que vous pouviez placer sur une page Web Forms et configurer comme d’autres contrôles. Visual Studio fournissait un ensemble convivial de boîtes de dialogue pour configurer et lier les contrôles à vos pages Web Forms. Les développeurs qui apprécient une approche « low code » ou « no code » préféraient cette technique lorsque Web Forms a été publié pour la première fois.
ADO.NET est l’approche de bas niveau pour interagir avec une base de données. Vos applications pouvaient créer une connexion à la base de données avec des commandes, des tables de données et des jeux de données à des fins d’interaction. Les résultats pouvaient ensuite être liés aux champs à l’écran avec peu de code. L’inconvénient de cette approche était que chaque ensemble d’objets ADO.NET (Connection
, Command
et DataTable
) était lié aux bibliothèques fournies par un fournisseur de base de données. L’utilisation de ces composants rendait le code rigide et difficile à migrer vers une autre base de données.
Entity Framework
Entity Framework (EF) est le framework open source de mappage objet-relationnel géré par .NET Foundation. Initialement publié avec .NET Framework, EF permet de générer du code pour les connexions de base de données, les schémas de stockage et les interactions. Avec cette abstraction, vous pouvez vous concentrer sur les règles métier de votre application et autoriser la gestion de la base de données par un administrateur de base de données approuvé. Dans .NET, vous pouvez utiliser une version mise à jour d’EF appelée EF Core. EF Core permet de générer et de gérer les interactions entre votre code et la base de données avec une série de commandes disponibles pour vous à l’aide de l’outil en ligne de commande dotnet ef
. Examinons quelques exemples pour vous aider à utiliser une base de données.
EF Code First
Un moyen rapide de commencer à créer vos interactions de base de données consiste à commencer par les objets de classe que vous souhaitez utiliser. EF fournit un outil permettant de générer le code de base de données approprié pour vos classes. Cette approche est appelée développement « Code First ». Considérez la classe Product
suivante pour un exemple d’application de vitrine que nous voulons stocker dans une base de données relationnelle comme 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; }
}
Le produit a une clé primaire et trois champs supplémentaires qui seraient créés dans notre base de données :
- EF identifie la propriété
Id
comme clé primaire par convention. Name
est stocké dans une colonne configurée pour le stockage texte. L’attribut[Required]
décorant cette propriété ajoute une contraintenot null
pour aider à appliquer ce comportement déclaré de la propriété.Description
est stocké dans une colonne configurée pour le stockage texte et a une longueur maximale configurée de 4 000 caractères, comme indiqué par l’attribut[MaxLength]
. Le schéma de base de données est configuré avec une colonne nomméeMaxLength
à l’aide du type de donnéesvarchar(4000)
.- La propriété
Price
est stockée en tant que devise. L’attribut[Range]
génère des contraintes appropriées pour empêcher le stockage de données en dehors des valeurs minimales et maximales déclarées.
Nous devons ajouter cette classe Product
à une classe de contexte de base de données qui définit les opérations de connexion et de traduction avec notre base de données.
public class MyDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
La classe MyDbContext
fournit la propriété qui définit l’accès et la traduction de la classe Product
. Votre application configure cette classe à des fins d’interaction avec la base de données à l’aide des entrées suivantes dans la méthode ConfigureServices
de la classe Startup
(ou emplacement approprié dans Program.cs à l’aide de la propriété builder.Services
au lieu de services
) :
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer("MY DATABASE CONNECTION STRING"));
Le code précédent se connecte à une base de données SQL Server avec la chaîne de connexion spécifiée. Vous pouvez placer la chaîne de connexion dans votre fichier appsettings.json, des variables d’environnement ou d’autres emplacements de stockage de configuration et remplacer cette chaîne incorporée de manière appropriée.
Vous pouvez ensuite générer la table de base de données appropriée pour cette classe à l’aide des commandes suivantes :
dotnet ef migrations add 'Create Product table'
dotnet ef database update
La première commande définit les modifications que vous apportez au schéma de base de données en tant que nouvelle migration EF appelée Create Product table
. Une migration définit comment appliquer et supprimer vos nouvelles modifications de base de données.
Une fois eappliqué, vous disposez d’une table simple Product
dans votre base de données et de certaines nouvelles classes ajoutées au projet qui aident à gérer le schéma de base de données. Vous pouvez trouver ces classes générées, par défaut, dans un nouveau dossier appelé Migrations. Lorsque vous apportez des modifications à la classe Product
ou ajoutez des classes associées que vous souhaitez faire interagir avec votre base de données, vous devez réexécuter les commandes en ligne de commande avec un nouveau nom de migration. Cette commande génère un autre ensemble de classes de migration pour mettre à jour votre schéma de base de données.
EF Database First
Pour les bases de données existantes, vous pouvez générer les classes pour EF Core à l’aide des outils en ligne de commande .NET. Pour créer la structure des classes, utilisez une variante de la commande suivante :
dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer
La commande précédente se connecte à la base de données à l’aide de la chaîne de connexion spécifiée et du fournisseur Microsoft.EntityFrameworkCore.SqlServer
. Une fois connectée, une classe de contexte de base de données nommée MyDbContext
est créée. En outre, les classes de prise en charge sont créées pour les tables Product
et Customer
qui ont été spécifiées avec les options -t
. Il existe de nombreuses options de configuration pour cette commande afin de générer la hiérarchie de classes appropriée pour votre base de données. Pour accéder à une référence complète, consultez la documentation de la commande.
Pour plus d’informations sur EF Core, consultez le site Microsoft Docs.
Interagir avec les services web
Lorsque ASP.NET a été publiée pour la première fois, les services SOAP étaient le moyen préféré pour les serveurs web et les clients d’échanger des données. Cela a changé et les interactions préférées avec les services ont changé et il s’agit maintenant des interactions clientes HTTP directes. Avec ASP.NET Core et Blazor, vous pouvez inscrire la configuration de votre HttpClient
dans Program.cs ou dans la méthode ConfigureServices
de la classe Startup
. Utilisez cette configuration lorsque vous devez interagir avec le point de terminaison HTTP. Tenez compte du code de configuration suivant :
// 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");
});
Chaque fois que vous devez accéder aux données à partir de GitHub, créez un client avec le nom github
. Le client est configuré avec l’adresse de base et les en-têtes de demande sont définis de manière appropriée. Injectez les éléments IHttpClientFactory
dans vos composants Blazor avec la directive @inject
ou un attribut [Inject]
sur une propriété. Créez votre client nommé et interagissez avec les services à l’aide de la syntaxe suivante :
@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();
}
}
Cette méthode retourne la chaîne décrivant la collection de problèmes dans le dépôt GitHub dotnet/docs. Elle retourne du contenu au format JSON et est désérialisée dans les objets de problème GitHub appropriés. Il existe de nombreuses façons de configurer le service HttpClientFactory
pour fournir des objets préconfigurés HttpClient
. Essayez de configurer plusieurs instances HttpClient
avec différents noms et points de terminaison pour les différents services web que vous utilisez. Cette approche facilite l’utilisation de vos interactions avec ces services sur chaque page. Pour plus d’informations, consultez Effectuer des requêtes HTTP en utilisant IHttpClientFactory.