Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Conseil / Astuce
Ce contenu est un extrait du livre électronique, Blazor pour les développeurs ASP NET Web Forms pour Azure, disponible sur .NET Docs ou en tant que PDF téléchargeable gratuitement qui peut être lu hors connexion.
L'accès aux données est l'épine dorsale de l'application Web Forms ASP.NET. Si vous créez des formulaires pour le web, que se passe-t-il pour 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 :
- Sources de données
- 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 a fourni un ensemble convivial de dialogues pour configurer et lier les contrôles à vos pages Web Forms. Les développeurs qui apprécient une approche « low code » ou « no code » ont préféré 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 peuvent créer une connexion à la base de données avec des commandes, des datatables et des jeux de données pour interagir. Les résultats peuvent ensuite être liés à des champs à l’écran sans beaucoup de code. L’inconvénient de cette approche était que chaque ensemble d’objets ADO.NET (Connection, Commandet DataTable) était lié aux bibliothèques fournies par un fournisseur de base de données. L’utilisation de ces composants rend le code rigide et difficile à migrer vers une autre base de données.
Entity Framework
Entity Framework (EF) est le framework de mappage relationnel objet open source 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 base de données à être gérée 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 dotnet ef en ligne de commande. 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 suivante Product 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
Idpropriété comme clé primaire par convention. -
Namesera stocké dans une colonne configurée pour le stockage de texte. L’attribut[Required]décorant cette propriété ajoute unenot nullcontrainte pour aider à appliquer ce comportement déclaré de la propriété. -
Descriptionsera stocké dans une colonne configurée pour le stockage de 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 sera configuré avec une colonne nomméeMaxLengthà l’aide du type devarchar(4000)données. - La propriété
Priceest stockée en tant que devise. L’attribut[Range]génère des contraintes appropriées pour empêcher le stockage des données en dehors des valeurs minimales et maximales déclarées.
Nous devons ajouter cette Product classe à 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 MyDbContext classe fournit la propriété unique qui définit l’accès et la traduction pour la Product classe. Votre application configure cette classe pour l’interaction avec la base de données à l’aide des entrées suivantes dans la méthode Startup de la classe ConfigureServices (ou dans un emplacement approprié dans Program.cs en utilisant 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 , les 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 appliqué, vous disposez d’une table simple Product dans votre base de données et de nouvelles classes ajoutées au projet qui permettent de 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 Product classe ou ajoutez des classes connexes que vous souhaitez interagir avec votre base de données, vous devez réexécuter les commandes de ligne de commande avec un nouveau nom de la 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 générer une 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 Microsoft.EntityFrameworkCore.SqlServer fournisseur. Une fois connecté, une classe de contexte de base de données nommée MyDbContext est créée. En outre, des classes de support sont créées pour les tables Product et Customer spécifiées avec les options -t. Il existe de nombreuses options de configuration pour cette commande pour générer la hiérarchie de classes appropriée pour votre base de données. Pour obtenir une référence complète, consultez la documentation de la commande.
Vous trouverez plus d’informations sur EF Core sur 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. Beaucoup a changé depuis ce temps, et les interactions préférées avec les services sont passées aux interactions directes des clients HTTP. Avec ASP.NET Core et Blazor, vous pouvez enregistrer la configuration de votre HttpClient dans Program.cs ou dans la méthode Startup de la classe ConfigureServices. 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 avez besoin d’accéder aux données à partir de GitHub, créez un client avec le nom de github. Le client est configuré avec l’adresse de base et les en-têtes de requête 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 . Il retourne du contenu au format JSON et est désérialisé dans les objets de problème GitHub appropriés. Il existe de nombreuses façons de configurer le HttpClientFactory pour fournir des objets HttpClient préconfigurés. Essayez de configurer plusieurs HttpClient instances avec différents noms et points de terminaison pour les différents services web que vous utilisez. Cette approche simplifiera vos interactions avec ces services sur chaque page. Pour plus d’informations, consultez Effectuer des requêtes HTTP à l’aide de IHttpClientFactory.