Fermer

octobre 7, 2020

.NET MVC Framework – Appel asynchrone de DbContext dans un contrôleur à l'aide d'une classe de fournisseur


Bonjour à tous! Dans cette dernière partie de la série de didacticiels, je vais expliquer comment nous pouvons interroger les données de la base de données et les transmettre à la vue en appelant de manière asynchrone DbContext dans le contrôleur.

Overview

1) Créer un DTO (Data Transfer Object) dans le dossier '03 – Domain> Models '.

 public class CustomerDto {
    public int ID {get; ensemble; }
    chaîne publique Name {get; ensemble; }
    public string Email {get; ensemble; }
} 
  • Un DTO est comme un modèle où nous définissons des propriétés avec des getters et des setters.
  • Comme son nom l'indique, les DTO sont utilisés à la place des modèles réels pour «transférer des données» au contrôleur.

2) Créez une classe Provider qui agira comme intermédiaire entre le DbContext et le contrôleur.

  • Où nous allons créer une méthode async pour appeler DbContext et stocker les données dans le DTO.
  • Cette méthode async sera appelée dans le contrôleur où les données seront ensuite transmises à la vue.

Où nous allons commencer

Dans partie 1 de ce didacticiel, j'ai expliqué comment vous pourriez construire la structure de dossiers pour ASP.NET Projet MVC intégrant le framework d'entité basé sur la base de données. Dans partie 2 j'ai expliqué comment vous pouvez publier la base de données et faire de l'ingénierie inverse pour créer des modèles Dbset. Voici la structure de dossiers à partir de laquelle nous allons commencer sur la base des didacticiels précédents (vous n'en avez pas besoin pour suivre):

 Bp4 P1

Création d'un DTO et d'une classe de fournisseur

1) Ajoutez un Classe 'CustomerDto' sous le dossier '03 – Domaine> Modèles '. Ajoutez les propriétés (champs) avec les getters et les setters.

 Bp4 P2

Dans cette structure de dossiers dans laquelle je travaille, remarquez comment le CustomerDto est stocké dans le dossier Models sous '03 – Domain ', alors que le véritable Customer Model est stocké dans le dossier Models sous '04 – Database'.

 Bp4 P3

** Avant de continuer, nous devons remplacer DbContext.OnConfiguring (DbContextOptionsBuilder) dans le DatabaseContext pour configurer la base de données à utiliser pour ce contexte.

  • Ceci configure la connexion à la base de données à l'aide de la chaîne de connexion configurée dans web.config. En d'autres termes, nous devons également ajouter la chaîne de connexion dans le fichier web.config si nous ne l'avons pas!

 Bp4 P4

 Bp4 P5

À l'intérieur de la connexion string, la source de données est le nom du serveur (par exemple ou localhost), le catalogue initial est le nom de la table avec laquelle nous interagissons, tandis que Integrated Security = True nous permet d'accéder à la base de données à l'aide de l'authentification Windows. Il y a des ressources en ligne, y compris celle-ci que j'ai trouvée: https://blog.elmah.io/the-ultimate-guide-to-connection-strings-in-web-config/

2) Maintenant, nous pouvons ajoutez une classe 'CustomerProvider' sous le dossier '02 – Application> Providers '.

  • Declare the DbContext
  • Create constructors (constructor chaining is used) that will instantiate the DbContext using Dependency Injection

 Covid 19

 Bp4 P6

3) Ajoutez une méthode GetCustomersAsync () qui stockera les données de DbContext dans une liste de CustomerDto utilisant LINQ.

  • Task <> représente une opération unique qui s'exécute généralement de manière asynchrone.
  • Dans notre exemple, nous sommes en utilisant LINQ to .Select variable (Id, Name, & Email) pour stocker chacun d'eux dans les variables de l'objet CustomerDto. Nous utilisons la méthode .SingleOrDefaultAsync () pour renvoyer l'objet CustomerDto.
  • .AsNoTracking () est utilisé de manière conventionnelle car les entités renvoyées seront mises en cache dans le DbContext par défaut, ce qui génère des erreurs lorsque nous appelons une entité à différents endroits en même temps time.

 Bp4 P8

Nous pouvons utiliser la méthode .ToListAsync () pour renvoyer une liste d'objets comme illustré ci-dessous.

 Bp4 P9

En cours de route, vous devrez peut-être installer des packages ( Microsoft.EntityFrameworkCore) pour ajouter une référence au DbSet.

 Bp4 P7

REMARQUE: nous aurons besoin d'installer quelques packages Nuget pour utiliser la classe Task et SqlClient pour DbContext pour interagir avec le serveur SQL. Sans les installations, vous pourriez rencontrer des erreurs telles que «Impossible de charger le fichier ou l'assembly 'System.Threading.Tasks.Extensions'» comme celle illustrée ci-dessous:

 Bp4 P10

Pour installer ces packages Nuget, accédez au Gestionnaire de packages Console.

 Bp4 P11

Collez chacune de ces lignes dans 'PM>'

PM> Install-Package System.Threading.Tasks.Extensions -Version 4.5.4

PM> Install-Package Microsoft. Data.SqlClient -Version 2.1.0-preview1.20235.1

Pour les versions mises à jour au moment de votre lecture, cliquez ici pour System.Threading.Tasks.Extensions et ici pour Microsoft.Data.SqlClient.

C'est à peu près tout pour créer des méthodes DTO et async dans la classe du fournisseur. Nous pouvons maintenant appeler la méthode depuis le contrôleur et la passer à la vue!

Créer un contrôleur et une vue

1) Dans nos exemples, nous utiliserons IndexController. Créez des constructeurs pour instancier les fournisseurs. Je peux appeler la méthode .GetCustomerAsync () que j'ai créée dans la classe du fournisseur et la stocker dans une variable. Nous passerons ensuite cette variable à la vue.

 Bp4 P12

2) Voici à quoi ressembleront notre page de rasoir et la vue!

 Bp4 P13

 Bp4 P14 À quoi ressemble notre base de données Demo_01

 Bp4 P15

J'espère que cela a aidé!

À propos de l'auteur

David Hwang est un technicien associé Consultant dans la Business Unit Sitecore / Microsoft. Il rédigera un blog sur divers concepts des technologies pour les débutants. f.fbq = function () {n.callMethod?
n.callMethod.apply (n, arguments): n.queue.push (arguments)}; if (! f._fbq) f._fbq = n;
n.push = n; n.loaded =! 0; n.version = '2.0'; n.queue = []; t = b.createElement (e); t.async =! 0;
t.src = v; s = b.getElementsByTagName (e) [0]; s.parentNode.insertBefore (t, s)} (fenêtre,
document, 'script', 'https: //connect.facebook.net/en_US/fbevents.js');

fbq («init», «911436665572720»);
fbq ('track', "PageView");




Source link