Création de classes de modèle avec Entity Framework (VB)

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 ADO.NET Entity Data Model. 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 ASP.NET MVC. Ce tutoriel suppose qu’il n’y a aucune connaissance préalable de Microsoft Entity Framework. À la fin de ce tutoriel, vous allez comprendre 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’objet (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.

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.

Pour illustrer comment vous pouvez 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 tutoriel 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 :

https://www.asp.net/downloads/

Création de la base de données d’exemples de films

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 ? Est-ce que la clé primaire ?
Id int False True
Titre nvarchar(100) False False
Directeur nvarchar(100) False False

Vous pouvez ajouter cette table à un projet MVC ASP.NET en procédant comme suit :

  1. 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.
  2. 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.
  3. Double-cliquez sur le fichier MoviesDB.mdf pour ouvrir la fenêtre Explorer Explorer/base de données.
  4. Développez la connexion de 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.
  5. Dans le Designer Table, ajoutez les colonnes Id, Title et Director.
  6. Cliquez sur le bouton Enregistrer (il contient 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 de film 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 :

  1. Cliquez avec le bouton droit sur le dossier Models dans la fenêtre Explorateur de solutions et sélectionnez l’option de menu Ajouter, Nouvel élément.
  2. Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez la catégorie Données (voir figure 1).
  3. Sélectionnez le ADO.NET modèle Entity Data Model , donnez à Entity Data Model le nom MoviesDBModel.edmx, puis cliquez sur le bouton Ajouter . Cliquez sur le bouton Ajouter pour lancer l’Assistant Modèle de données.
  4. Dans 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).
  5. Dans l’étape Choisir votre connexion de données , sélectionnez la connexion de base de données MoviesDB.mdf, entrez le nom des paramètres de connexion d’entités MoviesDBEntités, puis cliquez sur le bouton Suivant (voir figure 3).
  6. À l’étape Choisir vos objets de base de données , sélectionnez la table de base de données Movie, puis cliquez sur le bouton Terminer (voir figure 4).

Une fois ces étapes terminées, le Designer entity data model ADO.NET (entity Designer) s’ouvre.

Figure 1 – Création d’un modèle de données d’entité

clip_image002

Figure 2 : étape Choisir le contenu du modèle

clip_image004

Figure 3 – Choisir votre connexion de données

clip_image006

Figure 4 – Choisir vos objets de base de données

clip_image008

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 la figure 5). Vous pouvez ouvrir le Designer Entity à tout moment en double-cliquant sur le fichier MoviesDBModel.edmx contenu dans le dossier Models dans la fenêtre Explorateur de solutions.

Figure 5 : Designer du modèle de données d’entité ADO.NET

clip_image010

Par exemple, vous pouvez utiliser le Designer d’entité pour modifier les noms des classes générées par l’Assistant Données du 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 de film particulier, nous devons renommer la classe Movies en Movie.

Si vous souhaitez renommer une classe d’entité, vous pouvez double-cliquer sur le nom de la classe dans le Designer Entity et entrer un nouveau nom (voir la 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é

clip_image012

N’oubliez pas d’enregistrer votre Entity Data Model 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 Visual Basic .NET. Vous pouvez afficher ces classes en ouvrant moviesDBModel. fichier Designer.vb de la fenêtre Explorateur de solutions.

Ne modifiez pas le code dans le fichier Designer.vb, car vos modifications seront remplacées la prochaine fois que vous utiliserez l’entité Designer. Si vous souhaitez étendre les fonctionnalités des classes d’entités définies dans le fichier Designer.vb, 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 par 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 movie database en tirant parti d’Entity Framework.

Listing 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

Notez que le contrôleur dans la liste 1 inclut un constructeur. Le constructeur initialise un champ au niveau de la 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.

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( Of 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="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.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>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

La vue de La liste 2 contient une boucle For Each qui itère 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

clip_image014

La vue Index est une vue typée. La vue Index a une <directive %@ Page %> qui inclut un attribut Inherits. L’attribut Inherits caste la propriété ViewData.Model en une collection List générique fortement typée d’objets Movie, à l’exception d’une liste (Of 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.vb (Ajouter des méthodes)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

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

clip_image016

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.vb (Méthodes d’édition)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

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 :

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(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="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.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 id="Head1" 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.vb (action supprimer)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

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.