Création de classes de modèle avec LINQ to SQL (VB)
par Microsoft
L’objectif de ce didacticiel est d’expliquer une méthode de création de classes de modèle pour une application MVC ASP.NET. Dans ce tutoriel, vous allez apprendre à créer des classes de modèle et à effectuer l’accès aux bases de données en tirant parti de Microsoft LINQ to SQL.
L’objectif de ce didacticiel est d’expliquer une méthode de création de classes de modèle pour une application MVC ASP.NET. Dans ce tutoriel, vous allez apprendre à créer des classes de modèle et à effectuer l’accès aux bases de données en tirant parti de Microsoft LINQ to SQL.
Dans ce tutoriel, nous créons une application de base de données movie de base de données. Nous commençons par créer l’application de base de données movie de la manière la plus rapide et la plus simple possible. Nous effectuons toutes nos opérations d’accès aux données directement à partir de nos actions de contrôleur.
Ensuite, vous allez apprendre à utiliser le modèle Référentiel. L’utilisation du modèle Référentiel nécessite un peu plus de travail. Toutefois, l’avantage de l’adoption de ce modèle est qu’il vous permet de créer des applications adaptables au changement et qui peuvent être facilement testées.
Qu’est-ce qu’une classe de modèle ?
Un modèle MVC contient toute la logique d’application qui n’est pas contenue dans une vue MVC ou un contrôleur MVC. En particulier, un modèle MVC contient l’ensemble de la logique d’accès aux données et à l’entreprise de votre application.
Vous pouvez utiliser différentes technologies pour implémenter votre logique d’accès aux données. Par exemple, vous pouvez créer vos classes d’accès aux données à l’aide des classes Microsoft Entity Framework, NHibernate, Subsonic ou ADO.NET.
Dans ce tutoriel, j’utilise LINQ to SQL pour interroger et mettre à jour la base de données. LINQ to SQL vous offre une méthode très simple d’interaction avec une base de données Microsoft SQL Server. Toutefois, il est important de comprendre que l’infrastructure ASP.NET MVC n’est pas liée à LINQ to SQL de quelque manière que ce soit. ASP.NET MVC est compatible avec n’importe quelle technologie d’accès aux données.
Créer une base de données de films
Dans ce tutoriel, afin d’illustrer comment vous pouvez créer des classes de modèles, nous créons une application de base de données de films simple. La première étape consiste à créer une base de données. Cliquez avec le bouton droit sur le dossier App_Data dans la fenêtre Explorateur de solutions et sélectionnez l’option de menu Ajouter, Nouvel élément. Sélectionnez le modèle base de données SQL Server, donnez-lui le nom MoviesDB.mdf, puis cliquez sur le bouton Ajouter (voir figure 1).
Figure 01 : Ajout d’une nouvelle base de données SQL Server (cliquer pour afficher l’image en taille réelle)
Après avoir créé la nouvelle base de données, vous pouvez ouvrir la base de données en double-cliquant sur le fichier MoviesDB.mdf dans le dossier App_Data. Le double-clic sur le fichier MoviesDB.mdf ouvre la fenêtre Server Explorer (voir la figure 2).
La fenêtre Server Explorer est appelée fenêtre Database Explorer lors de l’utilisation de Visual Web Developer.
Figure 02 : Utilisation de la fenêtre Server Explorer (Cliquer pour afficher l’image en taille réelle)
Nous devons ajouter une table à notre base de données qui représente nos films. Cliquez avec le bouton droit sur le dossier Tables et sélectionnez l’option de menu Ajouter une nouvelle table. La sélection de cette option de menu ouvre l’Designer Table (voir la figure 3).
Figure 03 : Table Designer (Cliquer pour afficher l’image en taille réelle)
Nous devons ajouter les colonnes suivantes à notre table de base de données :
Nom de la colonne | Type de données | Null autorisé |
---|---|---|
Id | Int | False |
Titre | Nvarchar(200) | False |
Directeur | Nvarchar(50) | False |
Vous devez effectuer deux opérations spéciales pour la colonne Id. Tout d’abord, vous devez marquer la colonne Id comme colonne de clé primaire en sélectionnant la colonne dans le Designer Table et en cliquant sur l’icône d’une clé. LINQ to SQL vous oblige à spécifier vos colonnes de clé primaire lors de l’exécution d’insertions ou de mises à jour sur la base de données.
Ensuite, vous devez marquer la colonne Id en tant que colonne Identité en affectant la valeur Oui à la propriété Is Identity (voir la figure 3). Une colonne Identity est une colonne à laquelle un nouveau numéro est attribué automatiquement chaque fois que vous ajoutez une nouvelle ligne de données à une table.
Après avoir apporté ces modifications, enregistrez la table avec le nom tblMovie. Vous pouvez enregistrer la table en cliquant sur le bouton Enregistrer.
Créer des classes LINQ to SQL
Notre modèle MVC contient LINQ to SQL classes qui représentent la table de base de données tblMovie. Le moyen le plus simple de créer ces classes LINQ to SQL consiste à cliquer avec le bouton droit sur le dossier Models, à sélectionner Ajouter, Nouvel élément, à sélectionner le modèle LINQ to SQL Classes, à donner aux classes le nom Movie.dbml, puis à cliquer sur le bouton Ajouter (voir la Figure 4).
Figure 04 : Création de classes LINQ to SQL (Cliquer pour afficher l’image en taille réelle)
Immédiatement après avoir créé les classes movie LINQ to SQL, le Concepteur Objet Relationnel s’affiche. Vous pouvez faire glisser des tables de base de données de la fenêtre Server Explorer vers le Concepteur Objet Relationnel pour créer des classes LINQ to SQL qui représentent des tables de base de données particulières. Nous devons ajouter la table de base de données tblMovie à l’Concepteur Objet Relationnel (voir la figure 4).
Figure 05 : Utilisation de la Concepteur Objet Relationnel (Cliquer pour afficher l’image en taille réelle)
Par défaut, le Concepteur Objet Relationnel crée une classe portant le même nom que la table de base de données que vous faites glisser sur le Designer. Cependant, nous ne voulons pas appeler notre classe tblMovie. Par conséquent, cliquez sur le nom de la classe dans le Designer et remplacez le nom de la classe par Movie.
Enfin, n’oubliez pas de cliquer sur le bouton Enregistrer (l’image de la disquette) pour enregistrer les classes LINQ to SQL. Sinon, les classes LINQ to SQL ne seront pas générées par le Concepteur Objet Relationnel.
Utilisation de LINQ to SQL dans une action de contrôleur
Maintenant que nous avons nos classes LINQ to SQL, nous pouvons utiliser ces classes pour récupérer des données de la base de données. Dans cette section, vous allez apprendre à utiliser LINQ to SQL classes directement dans une action de contrôleur. Nous allons afficher la liste des films de la table de base de données tblMovies dans une vue MVC.
Tout d’abord, nous devons modifier la classe HomeController. Cette classe se trouve dans le dossier Controllers de votre application. Modifiez la classe pour qu’elle ressemble à la classe dans la liste 1.
Listing 1 – Controllers\HomeController.vb
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Function Index()
Dim dataContext As New MovieDataContext()
Dim movies = From m In dataContext.Movies _
Select m
return View(movies)
End Function
End Class
L’action Index() dans listing 1 utilise une classe DataContext LINQ to SQL (MovieDataContext) pour représenter la base de données MoviesDB. La classe MoveDataContext a été générée par le Concepteur Objet Relationnel Visual Studio.
Une requête LINQ est effectuée sur le DataContext pour récupérer tous les films de la table de base de données tblMovies. La liste des films est affectée à une variable locale nommée movies. Enfin, la liste des films est transmise à la vue par le biais des données d’affichage.
Pour afficher les films, nous devons ensuite modifier la vue Index. Vous trouverez la vue Index dans le dossier Views\Home\. Mettez à jour la vue Index afin qu’elle ressemble à celle de la liste 2.
Listing 2 – Views\Home\Index.aspx
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<%@ Import Namespace="MvcApplication1" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<% For Each m As Movie In ViewData.Model%>
<li><%= m.Title %></li>
<% Next%>
</ul>
</asp:Content>
Notez que la vue Index modifiée inclut une <directive %@ import namespace %> en haut de la vue. Cette directive importe l’espace de noms MvcApplication1. Nous avons besoin de cet espace de noms pour travailler avec les classes de modèle , en particulier la classe Movie, dans la vue.
La vue de la liste 2 contient une boucle For Each qui effectue une itération au sein de tous les éléments représentés par la propriété ViewData.Model. La valeur de la propriété Title s’affiche pour chaque film.
Notez que la valeur de la propriété ViewData.Model est convertie en IEnumerable. Cela est nécessaire pour parcourir le contenu de ViewData.Model. Une autre option consiste à créer une vue fortement typée. Lorsque vous créez une vue fortement typée, vous castez la propriété ViewData.Model en un type particulier dans la classe code-behind d’une vue.
Si vous exécutez l’application après avoir modifié la classe HomeController et la vue Index, vous obtenez une page vierge. Vous obtiendrez une page vierge, car il n’y a aucun enregistrement vidéo dans la table de base de données tblMovies.
Pour ajouter des enregistrements à la table de base de données tblMovies, cliquez avec le bouton droit sur la table de base de données tblMovies dans la fenêtre Server Explorer (fenêtre Database Explorer dans Visual Web Developer), puis sélectionnez l’option de menu Afficher les données de table. Vous pouvez insérer des enregistrements vidéo à l’aide de la grille qui s’affiche (voir la figure 5).
Figure 06 : Insertion de films (Cliquer pour afficher une image en taille réelle)
Une fois que vous avez ajouté des enregistrements de base de données à la table tblMovies et que vous avez exécuté l’application, vous verrez la page de la Figure 7. Tous les enregistrements de la base de données de films sont affichés dans une liste à puces.
Figure 07 : Affichage de films avec l’affichage Index (Cliquer pour afficher l’image en taille réelle)
Utilisation du modèle de dépôt
Dans la section précédente, nous avons utilisé LINQ to SQL classes directement dans une action de contrôleur. Nous avons utilisé la classe MovieDataContext directement à partir de l’action du contrôleur Index(). Il n’y a rien de mal à faire cela dans le cas d’une application simple. Toutefois, l’utilisation directe de LINQ to SQL dans une classe de contrôleur crée des problèmes lorsque vous devez créer une application plus complexe.
L’utilisation de LINQ to SQL au sein d’une classe de contrôleur rend difficile le basculement des technologies d’accès aux données à l’avenir. Par exemple, vous pouvez décider de passer de l’utilisation de Microsoft LINQ to SQL à l’utilisation de Microsoft Entity Framework comme technologie d’accès aux données. Dans ce cas, vous devez réécrire chaque contrôleur qui accède à la base de données au sein de votre application.
L’utilisation de LINQ to SQL dans une classe de contrôleur rend également difficile la création de tests unitaires pour votre application. Normalement, vous ne souhaitez pas interagir avec une base de données lors de l’exécution de tests unitaires. Vous souhaitez utiliser vos tests unitaires pour tester votre logique d’application et non votre serveur de base de données.
Pour créer une application MVC plus adaptable aux changements futurs et qui peut être plus facilement testée, vous devez envisager d’utiliser le modèle référentiel. Lorsque vous utilisez le modèle Référentiel, vous créez une classe de dépôt distincte qui contient toute la logique d’accès à la base de données.
Lorsque vous créez la classe de référentiel, vous créez une interface qui représente toutes les méthodes utilisées par la classe de dépôt. Dans vos contrôleurs, vous écrivez votre code sur l’interface au lieu du dépôt. De cette façon, vous pouvez implémenter le dépôt à l’aide de différentes technologies d’accès aux données à l’avenir.
L’interface dans listing 3 est nommée IMovieRepository et représente une méthode unique nommée ListAll().
Listing 3 – Models\IMovieRepository.vb
Public Interface IMovieRepository
Function ListAll() As IList(Of Movie)
End Interface
La classe de dépôt dans listing 4 implémente l’interface IMovieRepository. Notez qu’il contient une méthode nommée ListAll() qui correspond à la méthode requise par l’interface IMovieRepository.
Listing 4 – Models\MovieRepository.vb
Public Class MovieRepository Implements IMovieRepository
Private _dataContext As MovieDataContext
Public Sub New()
_dataContext = New MovieDataContext()
End Sub
Public Function ListAll() As IList(Of Movie) Implements IMovieRepository.ListAll
Dim movies = From m In _dataContext.Movies _
Select m
Return movies.ToList()
End Function
End Class
Enfin, la classe MoviesController dans listing 5 utilise le modèle Référentiel. Il n’utilise plus directement les classes LINQ to SQL.
Listing 5 – Controllers\MoviesController.vb
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
Public Class MoviesController
Inherits System.Web.Mvc.Controller
Private _repository As IMovieRepository
Sub New()
Me.New(New MovieRepository())
End Sub
Sub New(ByVal repository As IMovieRepository)
_repository = repository
End Sub
Function Index()
Return View(_repository.ListAll())
End Function
End Class
}
Notez que la classe MoviesController dans listing 5 a deux constructeurs. Le premier constructeur, le constructeur sans paramètre, est appelé lorsque votre application est en cours d’exécution. Ce constructeur crée une instance de la classe MovieRepository et la transmet au deuxième constructeur.
Le deuxième constructeur a un seul paramètre : un paramètre IMovieRepository. Ce constructeur affecte simplement la valeur du paramètre à un champ de niveau classe nommé _repository.
La classe MoviesController tire parti d’un modèle de conception logicielle appelé modèle d’injection de dépendances. En particulier, il utilise quelque chose appelé injection de dépendances de constructeur. Vous pouvez en savoir plus sur ce modèle en lisant l’article suivant de Martin Fowler :
http://martinfowler.com/articles/injection.html
Notez que tout le code de la classe MoviesController (à l’exception du premier constructeur) interagit avec l’interface IMovieRepository au lieu de la classe MovieRepository réelle. Le code interagit avec une interface abstraite au lieu d’une implémentation concrète de l’interface.
Si vous souhaitez modifier la technologie d’accès aux données utilisée par l’application, vous pouvez simplement implémenter l’interface IMovieRepository avec une classe qui utilise la technologie d’accès aux bases de données alternative. Par exemple, vous pouvez créer une classe EntityFrameworkMovieRepository ou une classe SubSonicMovieRepository. Étant donné que la classe de contrôleur est programmée par rapport à l’interface, vous pouvez passer une nouvelle implémentation de IMovieRepository à la classe de contrôleur et la classe continuerait à fonctionner.
En outre, si vous souhaitez tester la classe MoviesController, vous pouvez passer une classe de référentiel de films factices à MoviesController. Vous pouvez implémenter la classe IMovieRepository avec une classe qui n’accède pas réellement à la base de données, mais contient toutes les méthodes requises de l’interface IMovieRepository. De cette façon, vous pouvez tester la classe MoviesController sans réellement accéder à une base de données réelle.
Résumé
L’objectif de ce tutoriel était de montrer comment créer des classes de modèles MVC en tirant parti de Microsoft LINQ to SQL. Nous avons examiné deux stratégies d’affichage des données de base de données dans une application MVC ASP.NET. Tout d’abord, nous avons créé LINQ to SQL classes et utilisé les classes directement dans une action de contrôleur. L’utilisation de classes LINQ to SQL dans un contrôleur vous permet d’afficher rapidement et facilement des données de base de données dans une application MVC.
Ensuite, nous avons exploré un chemin légèrement plus difficile, mais certainement plus vertueux, pour afficher les données de base de données. Nous avons tiré parti du modèle Référentiel et avons placé toute notre logique d’accès à la base de données dans une classe de dépôt distincte. Dans notre contrôleur, nous avons écrit tout notre code sur une interface au lieu d’une classe concrète. L’avantage du modèle Référentiel est qu’il nous permet de modifier facilement les technologies d’accès aux bases de données à l’avenir et de tester facilement nos classes de contrôleur.