Création de classes de modèle avec Entity Framework (C#)
par Microsoft
Dans ce tutoriel, vous allez apprendre à utiliser ASP.NET MVC avec Microsoft Entity Framework. Vous allez apprendre à utiliser l’Assistant Entité pour créer un modèle de données d’entité ADO.NET. Au cours de ce tutoriel, nous créons une application web qui montre comment sélectionner, insérer, mettre à jour et supprimer des données de base de données à l’aide d’Entity Framework.
L’objectif de ce tutoriel est d’expliquer comment créer des classes d’accès aux données à l’aide de Microsoft Entity Framework lors de la création d’une application MVC ASP.NET. Ce tutoriel suppose qu’aucune connaissance préalable de Microsoft Entity Framework n’a pas été prise en compte. À la fin de ce didacticiel, vous comprendrez comment utiliser Entity Framework pour sélectionner, insérer, mettre à jour et supprimer des enregistrements de base de données.
Microsoft Entity Framework est un outil de mappage relationnel d’objets (O/RM) qui vous permet de générer automatiquement une couche d’accès aux données à partir d’une base de données. Entity Framework vous permet d’éviter le travail fastidieux de création manuelle de vos classes d’accès aux données.
Pour illustrer comment utiliser Microsoft Entity Framework avec ASP.NET MVC, nous allons créer un exemple d’application simple. Nous allons créer une application Movie Database qui vous permet d’afficher et de modifier des enregistrements de base de données de films.
Ce didacticiel suppose que vous disposez de Visual Studio 2008 ou Visual Web Developer 2008 avec Service Pack 1. Vous avez besoin du Service Pack 1 pour utiliser Entity Framework. Vous pouvez télécharger Visual Studio 2008 Service Pack 1 ou Visual Web Developer avec Service Pack 1 à l’adresse suivante :
Notes
Il n’existe aucune connexion essentielle entre ASP.NET MVC et Microsoft Entity Framework. Il existe plusieurs alternatives à Entity Framework que vous pouvez utiliser avec ASP.NET MVC. Par exemple, vous pouvez créer vos classes de modèle MVC à l’aide d’autres outils O/RM tels que Microsoft LINQ to SQL, NHibernate ou SubSonic.
Création de l’exemple de base de données movie
L’application Movie Database utilise une table de base de données nommée Movies qui contient les colonnes suivantes :
Nom de la colonne | Type de données | Autoriser les valeurs Null ? | La clé primaire est-elle ? |
---|---|---|---|
Id | int | False | True |
Titre | nvarchar(100) | False | False |
Directeur | nvarchar(100) | False | False |
Vous pouvez ajouter ce tableau à un projet MVC ASP.NET en procédant comme suit :
- 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.
- Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez SQL Server base de données, donnez à la base de données le nom MoviesDB.mdf, puis cliquez sur le bouton Ajouter.
- Double-cliquez sur le fichier MoviesDB.mdf pour ouvrir la fenêtre Server Explorer/Database Explorer.
- Développez la connexion à la base de données MoviesDB.mdf, cliquez avec le bouton droit sur le dossier Tables, puis sélectionnez l’option de menu Ajouter une nouvelle table.
- Dans la table Designer, ajoutez les colonnes Id, Title et Director.
- Cliquez sur le bouton Enregistrer (il a l’icône de la disquette) pour enregistrer la nouvelle table avec le nom Movies.
Après avoir créé la table de base de données Movies, vous devez ajouter des exemples de données à la table. Cliquez avec le bouton droit sur la table Movies et sélectionnez l’option de menu Afficher les données du tableau. Vous pouvez entrer de fausses données vidéo dans la grille qui s’affiche.
Création du modèle de données d’entité ADO.NET
Pour utiliser Entity Framework, vous devez créer un modèle de données d’entité. Vous pouvez tirer parti de l’Assistant Modèle de données d’entité Visual Studio pour générer automatiquement un modèle de données d’entité à partir d’une base de données.
Procédez comme suit :
- Cliquez avec le bouton droit sur le dossier Modèles dans la fenêtre Explorateur de solutions et sélectionnez l’option de menu Ajouter, Nouvel élément.
- Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez la catégorie Données (voir figure 1).
- Sélectionnez le modèle de données d’entité ADO.NET , donnez au modèle de données d’entité le nom MoviesDBModel.edmx, puis cliquez sur le bouton Ajouter . Cliquez sur le bouton Ajouter pour lancer l’Assistant Modèle de données.
- À l’étape Choisir le contenu du modèle , choisissez l’option Générer à partir d’une base de données , puis cliquez sur le bouton Suivant (voir figure 2).
- À l’étape Choisir votre connexion de données , sélectionnez la connexion à la base de données MoviesDB.mdf, entrez le nom des paramètres de connexion d’entités MoviesDBEntities, puis cliquez sur le bouton Suivant (voir figure 3).
- À l’étape Choisir vos objets de base de données , sélectionnez la table Movie database et cliquez sur le bouton Terminer (voir figure 4).
Une fois ces étapes terminées, le Designer de modèle de données d’entité ADO.NET (Designer d’entité) s’ouvre.
Figure 1 – Création d’un modèle de données d’entité
Figure 2 : étape Choisir le contenu du modèle
Figure 3 : choisir votre connexion de données
Figure 4 : Choisir vos objets de base de données
Modification du modèle de données d’entité ADO.NET
Après avoir créé un modèle de données d’entité, vous pouvez le modifier en tirant parti de l’Designer d’entité (voir figure 5). Vous pouvez ouvrir le Designer d’entité à tout moment en double-cliquant sur le fichier MoviesDBModel.edmx contenu dans le dossier Modèles dans la fenêtre Explorateur de solutions.
Figure 5 : modèle de données d’entité ADO.NET Designer
Par exemple, vous pouvez utiliser le Designer d’entité pour modifier les noms des classes générées par l’Assistant Données de modèle d’entité. L’Assistant a créé une classe d’accès aux données nommée Movies. En d’autres termes, l’Assistant a donné à la classe le même nom que la table de base de données. Étant donné que nous allons utiliser cette classe pour représenter un instance movie particulier, nous devons renommer la classe de Films en Film.
Si vous souhaitez renommer une classe d’entité, vous pouvez double-cliquer sur le nom de la classe dans le Designer d’entité et entrer un nouveau nom (voir figure 6). Vous pouvez également modifier le nom d’une entité dans le Fenêtre Propriétés après avoir sélectionné une entité dans le Designer d’entité.
Figure 6 : Modification d’un nom d’entité
N’oubliez pas d’enregistrer votre modèle de données d’entité après avoir apporté une modification en cliquant sur le bouton Enregistrer (icône de la disquette). En arrière-plan, le Designer Entity génère un ensemble de classes C#. Vous pouvez afficher ces classes en ouvrant moviesDBModel. Designer.cs à partir de la fenêtre Explorateur de solutions.
Ne modifiez pas le code dans le fichier Designer.cs, car vos modifications seront remplacées la prochaine fois que vous utiliserez entity Designer. Si vous souhaitez étendre les fonctionnalités des classes d’entités définies dans le fichier Designer.cs, vous pouvez créer des classes partielles dans des fichiers distincts.
Sélection d’enregistrements de base de données avec Entity Framework
Commençons à créer notre application Movie Database en créant une page qui affiche une liste d’enregistrements vidéo. Le contrôleur d’accueil de la liste 1 expose une action nommée Index(). L’action Index() retourne tous les enregistrements vidéo de la table de base de données Movie en tirant parti d’Entity Framework.
Listing 1 – Controllers\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;
namespace MovieEntityApp.Controllers
{
[HandleError]
public class HomeController : Controller
{
MoviesDBEntities _db;
public HomeController()
{
_db = new MoviesDBEntities();
}
public ActionResult Index()
{
ViewData.Model = _db.MovieSet.ToList();
return View();
}
}
}
Notez que le contrôleur de la liste 1 inclut un constructeur. Le constructeur initialise un champ de niveau classe nommé _db. Le champ _db représente les entités de base de données générées par Microsoft Entity Framework. Le champ _db est un instance de la classe MoviesDBEntities qui a été générée par le Designer Entity.
Pour utiliser la classeMoviesDBEntities dans le contrôleur d’accueil, vous devez importer l’espace de noms MovieEntityApp.Models (MVCProjectName). Modèles).
Le champ _db est utilisé dans l’action Index() pour récupérer les enregistrements de la table de base de données Movies. Expression _db. MovieSet représente tous les enregistrements de la table de base de données Movies. La méthode ToList() est utilisée pour convertir l’ensemble de films en une collection générique d’objets Movie (List<Movie>).
Les enregistrements vidéo sont récupérés à l’aide de LINQ to Entities. L’action Index() dans Listing 1 utilise la syntaxe de méthode LINQ pour récupérer le jeu d’enregistrements de base de données. Si vous préférez, vous pouvez utiliser la syntaxe de requête LINQ à la place. Les deux instructions suivantes font la même chose :
ViewData.Model = _db.MovieSet.ToList();
ViewData.Model = (from m in _db.MovieSet select m).ToList();
Utilisez la syntaxe LINQ (syntaxe de méthode ou syntaxe de requête) que vous trouvez la plus intuitive. Il n’y a pas de différence de performances entre les deux approches : la seule différence est le style.
L’affichage de la liste 2 est utilisé pour afficher les enregistrements vidéo.
Liste 2 – Views\Home\Index.aspx
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.Movie>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<% foreach (var m in ViewData.Model)
{ %>
Title: <%= m.Title %>
<br />
Director: <%= m.Director %>
<br />
<%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
<%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
<hr />
<% } %>
<%= Html.ActionLink("Add Movie", "Add") %>
</div>
</body>
</html>
L’affichage de la liste 2 contient une boucle foreach qui effectue une itération dans chaque enregistrement vidéo et affiche les valeurs des propriétés Title et Director de l’enregistrement vidéo. Notez qu’un lien Modifier et supprimer s’affiche en regard de chaque enregistrement. En outre, un lien Ajouter un film s’affiche en bas de la vue (voir figure 7).
Figure 7 : affichage Index
La vue Index est une vue typée. La vue Index comprend une <directive %@ Page %> avec un attribut Inherits qui caste la propriété Model en une collection List générique fortement typée d’objets Movie (List<Movie).
Insertion d’enregistrements de base de données avec Entity Framework
Vous pouvez utiliser Entity Framework pour faciliter l’insertion de nouveaux enregistrements dans une table de base de données. La liste 3 contient deux nouvelles actions ajoutées à la classe de contrôleur d’accueil que vous pouvez utiliser pour insérer de nouveaux enregistrements dans la table de base de données Movie.
Listing 3 – Controllers\HomeController.cs (Add methods)
public ActionResult Add()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var movieToAdd = new Movie();
// Deserialize (Include white list!)
TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToAdd.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToAdd.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToAdd);
}
La première action Ajouter() retourne simplement une vue. La vue contient un formulaire permettant d’ajouter un nouvel enregistrement de base de données de films (voir figure 8). Lorsque vous envoyez le formulaire, la deuxième action Add() est appelée.
Notez que la deuxième action Add() est décorée avec l’attribut AcceptVerbs. Cette action ne peut être appelée que lors de l’exécution d’une opération HTTP POST. En d’autres termes, cette action ne peut être appelée que lors de la publication d’un formulaire HTML.
La deuxième action Add() crée une nouvelle instance de la classe Entity Framework Movie à l’aide de la méthode TryUpdateModel() MVC ASP.NET. La méthode TryUpdateModel() prend les champs de la FormCollection passée à la méthode Add() et affecte les valeurs de ces champs de formulaire HTML à la classe Movie.
Lorsque vous utilisez Entity Framework, vous devez fournir une « liste sécurisée » de propriétés lorsque vous utilisez les méthodes TryUpdateModel ou UpdateModel pour mettre à jour les propriétés d’une classe d’entité.
Ensuite, l’action Ajouter() effectue une validation de formulaire simple. L’action vérifie que les propriétés Title et Director ont des valeurs. En cas d’erreur de validation, un message d’erreur de validation est ajouté à ModelState.
S’il n’y a aucune erreur de validation, un nouvel enregistrement vidéo est ajouté à la table de base de données Movies à l’aide d’Entity Framework. Le nouvel enregistrement est ajouté à la base de données avec les deux lignes de code suivantes :
_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();
La première ligne de code ajoute la nouvelle entité Movie au jeu de films suivis par Entity Framework. La deuxième ligne de code enregistre toutes les modifications apportées aux films qui sont suivis dans la base de données sous-jacente.
Figure 8 : vue Ajouter
Mise à jour des enregistrements de base de données avec Entity Framework
Vous pouvez suivre presque la même approche pour modifier un enregistrement de base de données avec Entity Framework que l’approche que nous venons d’adopter pour insérer un nouvel enregistrement de base de données. La liste 4 contient deux nouvelles actions de contrôleur nommées Edit(). La première action Modifier() retourne un formulaire HTML pour modifier un enregistrement vidéo. La deuxième action Modifier() tente de mettre à jour la base de données.
Listing 4 – Controllers\HomeController.cs (méthodes Edit)
public ActionResult Edit(int id)
{
// Get movie to update
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
ViewData.Model = movieToUpdate;
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
// Get movie to update
var id = Int32.Parse(form["id"]);
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
// Deserialize (Include white list!)
TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToUpdate.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToUpdate.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToUpdate);
}
La deuxième action Modifier() commence par récupérer l’enregistrement vidéo de la base de données qui correspond à l’ID du film en cours de modification. L’instruction LINQ to Entities suivante récupère le premier enregistrement de base de données qui correspond à un ID particulier :
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
Ensuite, la méthode TryUpdateModel() est utilisée pour affecter les valeurs des champs de formulaire HTML aux propriétés de l’entité de film. Notez qu’une liste de sécurité est fournie pour spécifier les propriétés exactes à mettre à jour.
Ensuite, une validation simple est effectuée pour vérifier que les propriétés Movie Title et Director ont des valeurs. S’il manque une valeur à l’une ou l’autre propriété, un message d’erreur de validation est ajouté à ModelState et ModelState.IsValid retourne la valeur false.
Enfin, s’il n’y a pas d’erreurs de validation, la table de base de données Movies sous-jacente est mise à jour avec toutes les modifications en appelant la méthode SaveChanges().
Lorsque vous modifiez des enregistrements de base de données, vous devez passer l’ID de l’enregistrement en cours de modification à l’action du contrôleur qui effectue la mise à jour de la base de données. Sinon, l’action du contrôleur ne sait pas quel enregistrement mettre à jour dans la base de données sous-jacente. La vue Modifier, contenue dans la liste 5, inclut un champ de formulaire masqué qui représente l’ID de l’enregistrement de base de données en cours de modification.
Liste 5 – Views\Home\Edit.aspx
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.Movie>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Edit</title>
<style type="text/css">
.input-validation-error
{
background-color:Yellow;
}
</style>
</head>
<body>
<div>
<h1>Edit Movie</h1>
<form method="post" action="/Home/Edit">
<!-- Include Hidden Id -->
<%= Html.Hidden("id") %>
Title:
<br />
<%= Html.TextBox("title") %>
<br /><br />
Director:
<br />
<%= Html.TextBox("director") %>
<br /><br />
<input type="submit" value="Edit Movie" />
</form>
</div>
</body>
</html>
Suppression d’enregistrements de base de données avec Entity Framework
La dernière opération de base de données, que nous devons aborder dans ce didacticiel, est la suppression des enregistrements de base de données. Vous pouvez utiliser l’action contrôleur dans La liste 6 pour supprimer un enregistrement de base de données particulier.
Liste 6 -- \Controllers\HomeController.cs (action Supprimer)
public ActionResult Delete(int id)
{
// Get movie to delete
var movieToDelete = _db.MovieSet.First(m => m.Id == id);
// Delete
_db.DeleteObject(movieToDelete);
_db.SaveChanges();
// Show Index view
return RedirectToAction("Index");
}
L’action Supprimer() récupère d’abord l’entité Movie qui correspond à l’ID passé à l’action. Ensuite, le film est supprimé de la base de données en appelant la méthode DeleteObject() suivie de la méthode SaveChanges(). Enfin, l’utilisateur est redirigé vers la vue Index.
Résumé
L’objectif de ce didacticiel était de montrer comment vous pouvez créer des applications web basées sur des bases de données en tirant parti de ASP.NET MVC et de Microsoft Entity Framework. Vous avez appris à créer une application qui vous permet de sélectionner, insérer, mettre à jour et supprimer des enregistrements de base de données.
Tout d’abord, nous avons expliqué comment utiliser l’Assistant Modèle de données d’entité pour générer un modèle de données d’entité à partir de Visual Studio. Ensuite, vous allez apprendre à utiliser LINQ to Entities pour récupérer un ensemble d’enregistrements de base de données à partir d’une table de base de données. Enfin, nous avons utilisé Entity Framework pour insérer, mettre à jour et supprimer des enregistrements de base de données.