Création de classes de modèle avec LINQ to SQL (C#)
par Microsoft
L’objectif de ce tutoriel 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 tutoriel 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. 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 tous nos 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 qui s’adaptent 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 toute 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 didacticiel, 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 MVC ASP.NET n’est en aucun cas liée à LINQ to SQL. 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 la façon dont vous pouvez créer des classes de modèles, nous créons une application de base de données Movie 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 de base de données SQL Server, nommez-lui 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 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 figure 2).
La fenêtre de Explorer serveur est appelée fenêtre Explorer de base de données 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 le Designer table (voir figure 3).
Figure 03 : La 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 Identity en affectant la valeur Oui à la propriété Is Identity (voir 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.
Créer des classes LINQ to SQL
Notre modèle MVC contiendra 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 Modèles, à sélectionner Ajouter, Nouvel élément, à sélectionner le modèle classes LINQ to SQL, à donner aux classes le nom Movie.dbml, puis à cliquer sur le bouton Ajouter (voir 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 à la Concepteur Objet Relationnel (voir figure 5).
Figure 05 : Utilisation de l’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. Toutefois, 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 LINQ to SQL Classes. 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 Contrôleurs de votre application. Modifiez la classe pour qu’elle ressemble à la classe dans la liste 1.
Référencement 1 – Controllers\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
var dataContext = new MovieDataContext();
var movies = from m in dataContext.Movies
select m;
return View(movies);
}
}
}
L’action Index()
dans Listing 1 utilise une LINQ to SQL classe DataContext (le MovieDataContext
) pour représenter la MoviesDB
base de données. La MoveDataContext
classe a été générée par le Concepteur Objet Relationnel Visual Studio.
Une requête LINQ est effectuée sur DataContext pour récupérer tous les films de la tblMovies
table de base de données. La liste des films est affectée à une variable locale nommée movies
. Enfin, la liste des films est transmise à la vue via les données d’affichage.
Pour afficher les films, nous devons ensuite modifier la vue Index. Vous trouverez la vue Index dans le Views\Home\
dossier. Mettez à jour la vue Index afin qu’elle ressemble à la vue de la liste 2.
Référencement 2 – Views\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<ul>
<% foreach (Movie m in (IEnumerable)ViewData.Model)
{ %>
<li> <%= m.Title %> </li>
<% } %>
</ul>
</asp:Content>
Notez que la vue Index modifiée inclut une <%@ import namespace %>
directive en haut de la vue. Cette directive importe le MvcApplication1.Models namespace
. Nous avons besoin de cet espace de noms pour utiliser les model
classes ( en particulier la Movie
classe ) dans la vue.
L’affichage de la liste 2 contient une foreach
boucle qui itère à travers tous les éléments représentés par la ViewData.Model
propriété . La valeur de la Title
propriété s’affiche pour chaque movie
.
Notez que la valeur de la ViewData.Model
propriété est castée en .IEnumerable
Cela est nécessaire pour parcourir en boucle le contenu de ViewData.Model
. Une autre option ici consiste à créer un type fortement typé view
. Lorsque vous créez un type fortement typé view
, vous castez la ViewData.Model
propriété en un type particulier dans la classe code-behind d’une vue.
Si vous exécutez l’application après avoir modifié la HomeController
classe et la vue Index, vous obtiendrez une page vide. Vous obtiendrez une page vierge, car il n’y a pas d’enregistrements vidéo dans la tblMovies
table de base de données.
Pour ajouter des enregistrements à la table de base de données, cliquez avec le tblMovies
bouton droit sur la tblMovies
table de base de données dans la fenêtre Serveur Explorer (fenêtre Explorer de base de données dans Visual Web Developer) et sélectionnez l’option de menu Afficher les données de table. Vous pouvez insérer movie
des enregistrements à l’aide de la grille qui s’affiche (voir figure 6).
Figure 06 : Insertion de films (Cliquer pour afficher l’image en taille réelle)
Une fois que vous avez ajouté des enregistrements de base de données à la tblMovies
table et que vous avez exécuté l’application, vous voyez 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 MovieDataContext
classe directement à partir de l’action du Index()
contrôleur. Il n’y a rien de mal à faire cela dans le cas d’une simple application. 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 dans 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 génération 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 testée plus facilement, 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 référentiel 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 référentiel. 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 de listing 3 est nommée IMovieRepository
et représente une seule méthode nommée ListAll()
.
Référencement 3 – Models\IMovieRepository.cs
using System.Collections.Generic;
namespace MvcApplication1.Models
{
public interface IMovieRepository
{
IList<Movie> ListAll();
}
}
La classe de référentiel 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
.
Référencement 4 – Models\MovieRepository.cs
using System.Collections.Generic;
using System.Linq;
namespace MvcApplication1.Models
{
public class MovieRepository : IMovieRepository
{
private MovieDataContext _dataContext;
public MovieRepository()
{
_dataContext = new MovieDataContext();
}
#region IMovieRepository Members
public IList<Movie> ListAll()
{
var movies = from m in _dataContext.Movies
select m;
return movies.ToList();
}
#endregion
}
}
Enfin, la MoviesController
classe de la liste 5 utilise le modèle Référentiel. Il n’utilise plus LINQ to SQL classes directement.
Liste 5 – Controllers\MoviesController.cs
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class MoviesController : Controller
{
private IMovieRepository _repository;
public MoviesController() : this(new MovieRepository())
{
}
public MoviesController(IMovieRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
return View(_repository.ListAll());
}
}
}
Notez que la MoviesController
classe 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 et la MovieRepository
transmet au deuxième constructeur.
Le deuxième constructeur a un seul paramètre : un IMovieRepository
paramètre. Ce constructeur affecte simplement la valeur du paramètre à un champ de niveau classe nommé _repository
.
La MoviesController
classe 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 MoviesController
classe (à l’exception du premier constructeur) interagit avec l’interface IMovieRepository
au lieu de la classe réelle MovieRepository
. 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 à la base de données alternative. Par exemple, vous pouvez créer une EntityFrameworkMovieRepository
classe ou une SubSonicMovieRepository
classe. É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 contrôleur et la classe continue de fonctionner.
En outre, si vous souhaitez tester la MoviesController
classe, vous pouvez passer une classe de dépôt de films factices au HomeController
. Vous pouvez implémenter la IMovieRepository
classe 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 unitairement la MoviesController
classe sans 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èle 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 un peu plus difficile, mais certainement plus vertueux, pour l’affichage des 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 référentiel 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.