question marks pavement

Entity Framework Core (EF Core en abrégé) est un ORM (mappeur relationnel objet) populaire de Microsoft qui vous permet d’effectuer des opérations CRUD (créer, lire, mettre à jour et supprimer) sans avoir à savoir comment les données sont conservées dans le sous-jacent. base de données.

Lorsque nous travaillons avec des ORM, nous exploitons souvent des modèles qui sont mappés sur des tables de base de données. Cependant, que se passe-t-il si nous avons un modèle qui n’imite pas une table de base de données ? Comment pouvons-nous mapper des types de non-entités et remplir des objets d’un tel modèle dans nos applications ? Nous pouvons accomplir cela avec des types de requête.

Initialement introduits dans EF Core 2.1, les types de requête sont des types non-entités (classes) qui peuvent être mappés à des tables ou des vues dans la base de données sans colonne d’identité spécifiée, c’est-à-dire des tables et des vues dépourvues de clé. Les types de requête EF Core simplifient l’interrogation des vues et des types de modèle qui ne nécessitent pas de colonnes d’identité. Cependant, étant donné que les types de requêtes n’ont pas de colonne d’identité définie, vous ne pouvez pas insérer, mettre à jour ou supprimer des données en les utilisant. Vous ne pouvez les utiliser que pour récupérer les données.

Les types de requête vous permettent de spécifier un mappage entre une requête de base de données et vos classes de domaine. Vous pouvez ensuite utiliser le même type de requête avec différents types de requêtes EF Core, telles que LINQ to Entities ou EF Core Migrations.

Cet article explique comment nous pouvons utiliser les types de requête EF Core dans les applications ASP.NET Core 7. Pour travailler avec les exemples de code fournis dans cet article, vous devez avoir installé Visual Studio 2022 Preview sur votre système. Si vous n’en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2022 ici.

Créer un projet d’API Web ASP.NET Core 7 dans Visual Studio 2022

Tout d’abord, créons un projet d’API Web ASP.NET Core dans Visual Studio 2022. Suivez ces étapes pour créer un nouveau projet d’API Web ASP.NET Core dans Visual Studio 2022 :

  1. Lancez l’IDE Visual Studio 2022.
  2. Cliquez sur “Créer un nouveau projet”.
  3. Dans la fenêtre “Créer un nouveau projet”, sélectionnez “API Web ASP.NET Core” dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre “Configurer votre nouveau projet”, spécifiez le nom et l’emplacement du nouveau projet.
  6. Cochez éventuellement la case « Placer la solution et le projet dans le même répertoire », selon vos préférences.
  7. Cliquez sur Suivant.
  8. Dans la fenêtre “Informations supplémentaires” affichée ci-dessous, sous Framework, sélectionnez .NET 7.0.
  9. Laissez la case à cocher “Utiliser les contrôleurs …” cochée puisque nous utiliserons des contrôleurs dans cet exemple. Laissez le “Type d’authentification” défini sur “Aucun” (par défaut).
  10. Assurez-vous que les cases à cocher “Activer Docker”, “Configurer pour HTTPS” et “Activer la prise en charge de l’API ouverte” sont décochées car nous n’utiliserons aucune de ces fonctionnalités ici.
  11. Cliquez sur Créer.

Nous utiliserons ce projet d’API Web ASP.NET Core 7 pour travailler avec les types de requête EF Core dans les sections suivantes de cet article.

Utilisation des types de requêtes dans ASP.NET Core 7

Commençons par créer des entités que nous pouvons interroger. Nous utiliserons les deux classes suivantes, Teacher et Batch, dans notre exemple.

 
    public class Teacher
    
        public int Id  get; set; 
        public string FirstName  get; set; 
        public string LastName  get; set; 
        public ICollection<Batch> Batches  get; set; 
    
    public class Batch
    
        public int Id  get; set; 
        public string Title  get; set; 
        public int NoOfStudents  get; set; 
        public int TeacherId  get; set; 
    

Créer une vue dans votre base de données

Créez maintenant une vue nommée BatchDetails dans votre base de données avec le code suivant. Nous utiliserons des types de requête pour mapper à cette vue.

 
Create View BatchDetails AS
Select t.FirstName, t.LastName, t.BatchTitle, t.NoOfStudents as Total_Students
From Teacher t
Join Batch b on b.Id = t.Id

Nous aurons également besoin d’une classe pouvant être utilisée pour stocker les données récupérées à partir de la vue que nous venons de créer. L’extrait de code suivant illustre comment vous pouvez créer une classe nommée BatchDetails pour stocker les données interrogées à partir de la vue.

 
public class BatchDetails
    
        public string FirstName  get; set; 
        public string LastName  get; set; 
        public string Title  get; set; 
        public int NoOfStudents  get; set; 
    

Configurer le type de requête dans EF Core

Vous avez deux façons de configurer le type de requête. Si vous souhaitez éviter d’encombrer votre DbContext, vous pouvez créer votre classe DbContext en tant que classe partielle, puis scinder complètement la déclaration DbQuery dans un fichier séparé.

Voici le contenu du fichier DemoDbContext.cs :

 
public partial class DemoDbContext : DbContext
    
        public DbSet<Teacher> Teachers  get; set; 
        public DbSet<Batch> Batches  get; set; 
    

Et voici le contenu du fichier DemoDbContextQuery.cs :

 
public partial class DemoDbContext : DbContext
    
        public DbQuery<BatchDetails> Batches  get; set; 
    

Vous devez configurer le type de requête dans la méthode OnModelCreating comme indiqué dans l’extrait de code ci-dessous.

 
protected override void OnModelCreating(ModelBuilder modelBuilder)

    modelBuilder.Query<BatchDetails>().ToView("BatchDetails");

Créer un référentiel dans ASP.NET Core

Nous allons maintenant créer un référentiel pour lire les données de la base de données. Notez que, tandis que le référentiel interagira directement avec la base de données, le contrôleur utilisera le référentiel pour obtenir des données. (Nous allons implémenter le contrôleur dans la section suivante.)

Créez un fichier nommé IBatchRepository.cs avec le code suivant. IBatchRepository servira d’interface pour notre BatchDetailsRepository.

 
public interface IBatchDetailsRepository
    
        public List<BatchDetails> GetBatchDetails();
    

Créez un autre fichier nommé BatchDetailsRepository.cs et entrez le code suivant pour créer la classe de référentiel.

 
    public class BatchDetailsRepository: IBatchDetailsRepository
    
        private DemoDbContext dbContext;
        public BatchDetailsRepository(DemoDbContext demoDbContext)
        
            dbContext = demoDbContext;
        
        public List<BatchDetails> GetBatchDetails()
        
            return dbContext.BatchDetails.ToList();
        
    

Créer un contrôleur d’API dans ASP.NET Core

Maintenant, créez un contrôleur d’API nommé BatchDetailsController dans un fichier portant le même nom et une extension .cs. Ensuite, écrivez-y le code suivant.

 
    [Route("api/[controller]")]
    [ApiController]
    public class BatchDetailsController : ControllerBase
    
        private IBatchDetailsRepository _batchDetailsRepository;
        public BatchDetailsController(IBatchDetailsRepository
        batchDetailsRepository)
        
            _batchDetailsRepository = batchDetailsRepository;
        
        [HttpGet]
        public IActionResult Get()
        
            return Ok(_batchDetailsRepository.GetBatchDetails());
        
    

Reportez-vous à la liste de codes précédente. Notez comment l’injection de dépendance a été utilisée pour injecter une instance de type IBatchDetailsRepository dans le constructeur de la classe BatchDetailsController.

Vous pouvez renvoyer des types de requête à partir de requêtes SQL brutes à l’aide de la méthode FromSql dans le type DbQuery et ils peuvent également participer à des relations.

Enfin, il existe deux limitations des types de requêtes que vous devez garder à l’esprit. Comme mentionné ci-dessus, étant donné que les types de requête ne peuvent pas être suivis par le contexte, vous ne pouvez les utiliser que pour des lectures, pas des écritures. Et vous ne pouvez pas utiliser les méthodes Add et Attach du DbContext lorsque vous travaillez avec des types de requête.

Copyright © 2022 IDG Communications, Inc.

Leave a Reply