Partager via


Création d’un modèle de données Entity Framework pour une application MVC ASP.NET (1 sur 10)

par Tom Dykstra

Remarque

Une version plus récente de cette série de tutoriels est disponible pour Visual Studio 2013, Entity Framework 6 et MVC 5.

L’exemple d’application web Contoso University montre comment créer ASP.NET applications MVC 4 à l’aide d’Entity Framework 5 et de Visual Studio 2012. L’exemple d’application est un site web pour une université Contoso fictive. Il comprend des fonctionnalités telles que l’admission des étudiants, la création des cours et les affectations des formateurs. Cette série de tutoriels explique comment créer l’exemple d’application Contoso University.

Code First

Il existe trois façons d’utiliser des données dans Entity Framework : Database First, Model First et Code First. Ce tutoriel concerne Code First. Pour plus d’informations sur les différences entre ces flux de travail et des conseils sur la façon de choisir le meilleur pour votre scénario, consultez Flux de travail de développement Entity Framework.

MVC

L’exemple d’application est basé sur ASP.NET MVC. Si vous préférez utiliser le modèle ASP.NET Web Forms, consultez la série de didacticiels Liaison de modèle et Web Forms et ASP.NET Carte de contenu d’accès aux données.

Versions du logiciel

Illustré dans le tutoriel Fonctionne également avec
Windows 8 Windows 7
Visual Studio 2012 Visual Studio 2012 Express for Web. Cette opération est automatiquement installée par le Kit de développement logiciel (SDK) Windows Azure si vous n’avez pas déjà VS 2012 ou VS 2012 Express for Web. Visual Studio 2013 doit fonctionner, mais le didacticiel n’a pas été testé avec lui, et certaines sélections de menu et boîtes de dialogue sont différentes. La version VS 2013 du Kit de développement logiciel (SDK) Windows Azure est requise pour le déploiement de Windows Azure.
.NET 4.5 La plupart des fonctionnalités affichées fonctionnent dans .NET 4, mais certaines ne fonctionnent pas. Par exemple, la prise en charge de l’énumération dans EF nécessite .NET 4.5.
Entity Framework 5
Kit de développement logiciel (SDK) Windows Azure 2.1 Si vous ignorez les étapes de déploiement Windows Azure, vous n’avez pas besoin du Kit de développement logiciel (SDK). Lorsqu’une nouvelle version du Kit de développement logiciel (SDK) est publiée, le lien installe la version la plus récente. Dans ce cas, vous devrez peut-être adapter certaines des instructions aux nouvelles fonctionnalités et à l’interface utilisateur.

Questions

Si vous avez des questions qui ne sont pas directement liées au didacticiel, vous pouvez les publier sur le forum ASP.NET Entity Framework, le forum Entity Framework et LINQ to Entities, ou StackOverflow.com.

Remerciements

Consultez le dernier tutoriel de la série pour connaître les accusés de réception et une note sur VB.

The Contoso University Web Application

L’application que vous allez générer dans ces didacticiels est un site web simple d’université.

Les utilisateurs peuvent afficher et mettre à jour les informations relatives aux étudiants, aux cours et aux formateurs. Voici quelques écrans que vous allez créer.

Students_Index_page

Captures d’écran montrant l’exemple de page de recherche étudiants de l’application web Contoso University et la page Créer un nouvel étudiant.

Le style d’interface utilisateur de ce site a été maintenu proche de ce qui est généré par les modèles intégrés, afin que le didacticiel puisse principalement se concentrer sur la façon d’utiliser Entity Framework.

Prérequis

Les instructions et captures d’écran de ce tutoriel supposent que vous utilisez Visual Studio 2012 ou Visual Studio 2012 Express for Web, avec la dernière mise à jour et le Kit de développement logiciel (SDK) Azure pour .NET installés à compter de juillet 2013. Vous pouvez obtenir tout cela avec le lien suivant :

Kit de développement logiciel (SDK) Azure pour .NET (Visual Studio 2012)

Si Visual Studio est installé, le lien ci-dessus installe les composants manquants. Si vous n’avez pas Visual Studio, le lien installe Visual Studio 2012 Express for Web. Vous pouvez utiliser Visual Studio 2013, mais certaines des procédures et écrans requis diffèrent.

Créer une application web MVC

Ouvrez Visual Studio et créez un projet C# nommé « ContosoUniversity » à l’aide du modèle d’application web MVC 4 ASP.NET. Assurez-vous que vous ciblez .NET Framework 4.5 (vous utiliserez enum des propriétés et cela nécessite .NET 4.5).

New_project_dialog_box

Dans la boîte de dialogue Nouveau ASP.NET projet MVC 4, sélectionnez le modèle d’application Internet.

Laissez le moteur d’affichage Razor sélectionné et laissez la case à cocher Créer un projet de test unitaire désactivée.

Cliquez sur OK.

Project_template_options

Configurer le style de site

Quelques changements simples configureront le menu, la disposition et la page d’accueil du site.

Ouvrez Views\Shared\_Layout.cshtml et remplacez le contenu du fichier par le code suivant. Les modifications sont mises en surbrillance.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title - Contoso University</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <header>
            <div class="content-wrapper">
                <div class="float-left">
                    <p class="site-title">@Html.ActionLink("Contoso University", "Index", "Home")</p>
                </div>
                <div class="float-right">
                    <section id="login">
                        @Html.Partial("_LoginPartial")
                    </section>
                    <nav>
                        <ul id="menu">
                            <li>@Html.ActionLink("Home", "Index", "Home")</li>
                            <li>@Html.ActionLink("About", "About", "Home")</li>
                            <li>@Html.ActionLink("Students", "Index", "Student")</li>
                            <li>@Html.ActionLink("Courses", "Index", "Course")</li>
                            <li>@Html.ActionLink("Instructors", "Index", "Instructor")</li>
                            <li>@Html.ActionLink("Departments", "Index", "Department")</li>
                        </ul>
                    </nav>
                </div>
            </div>
        </header>
        <div id="body">
            @RenderSection("featured", required: false)
            <section class="content-wrapper main-content clear-fix">
                @RenderBody()
            </section>
        </div>
        <footer>
            <div class="content-wrapper">
                <div class="float-left">
                    <p>&copy; @DateTime.Now.Year - Contoso University</p>
                </div>
            </div>
        </footer>

        @Scripts.Render("~/bundles/jquery")
        @RenderSection("scripts", required: false)
    </body>
</html>

Ce code apporte les modifications suivantes :

  • Remplace les instances de modèle « My ASP.NET MVC Application » et « your logo here » par « Contoso University ».
  • Ajoute plusieurs liens d’action qui seront utilisés plus loin dans le didacticiel.

Dans Views\Home\Index.cshtml, remplacez le contenu du fichier par le code suivant pour éliminer les paragraphes de modèle sur ASP.NET et MVC :

@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1>@ViewBag.Title.</h1>
                <h2>@ViewBag.Message</h2>
            </hgroup>
        </div>
    </section>
}

Dans Controllers\HomeController.cs, remplacez la valeur de ViewBag.Message la Index méthode Action par « Bienvenue dans Contoso University ! », comme indiqué dans l’exemple suivant :

public ActionResult Index()
{
    ViewBag.Message = "Welcome to Contoso University";

    return View();
}

Appuyez sur Ctrl+F5 pour exécuter le site. Vous voyez la page d’accueil avec le menu principal.

Contoso_University_home_page

Créer le modèle de données

Ensuite, vous allez créer des classes d’entités pour l’application Contoso University. Vous allez commencer par les trois entités suivantes :

Class_diagram

Il existe une relation un-à-plusieurs entre les entités Student et Enrollment, et une relation un-à-plusieurs entre les entités Course et Enrollment. En d’autres termes, un étudiant peut être inscrit dans un nombre quelconque de cours et un cours peut avoir un nombre quelconque d’élèves inscrits.

Dans les sections suivantes, vous allez créer une classe pour chacune de ces entités.

Remarque

Si vous essayez de compiler le projet avant de terminer la création de toutes ces classes d’entité, vous obtiendrez des erreurs du compilateur.

Entité Student

Student_entity

Dans le dossier Models , créez Student.cs et remplacez le code existant par le code suivant :

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int StudentID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }
        
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

La propriété StudentID devient la colonne de clé primaire de la table de base de données qui correspond à cette classe. Par défaut, Entity Framework interprète une propriété nommée ID ou classname ID comme clé primaire.

La propriété Enrollments est une propriété de navigation. Les propriétés de navigation contiennent d’autres entités qui sont associées à cette entité. Dans ce cas, la Enrollments propriété d’une Student entité contiendra toutes les Enrollment entités associées à cette Student entité. En d’autres termes, si une ligne donnée Student dans la base de données comporte deux lignes associées Enrollment (lignes qui contiennent la valeur de clé primaire de cet étudiant dans sa StudentID colonne de clé étrangère), la propriété de navigation de Enrollments cette Student entité contiendra ces deux Enrollment entités.

Les propriétés de navigation sont généralement définies pour virtual qu’elles puissent tirer parti de certaines fonctionnalités Entity Framework telles que le chargement différé. (Le chargement différé sera expliqué plus tard, dans la Lire le didacticiel sur les données associées plus loin dans cette série.

Si une propriété de navigation peut contenir plusieurs entités (comme dans des relations plusieurs à plusieurs ou un -à-plusieurs), son type doit être une liste dans laquelle les entrées peuvent être ajoutées, supprimées et mises à jour, telle que ICollection.

Entité d’inscription

Enrollment_entity

Dans le dossier Models, créez Enrollment.cs et remplacez le code existant par le code suivant :

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }
        
        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

La propriété Grade est une énumération. La présence du point d’interrogation après la déclaration de type Grade indique que la propriété Gradeaccepte les valeurs Null. Une note qui est null est différente d’une note zéro : null signifie qu’une note n’est pas connue ou n’a pas encore été affectée.

La propriété StudentID est une clé étrangère, et la propriété de navigation correspondante est Student. Une entité Enrollment est associée à une entité Student, donc la propriété peut contenir uniquement une entité Student unique (contrairement à la propriété de navigation Student.Enrollments que vous avez vue précédemment, qui peut contenir plusieurs entités Enrollment).

La propriété CourseID est une clé étrangère, et la propriété de navigation correspondante est Course. Une entité Enrollment est associée à une entité Course.

Entité Course

Course_entity

Dans le dossier Models , créez Course.cs, en remplaçant le code existant par le code suivant :

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }
        
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

La propriété Enrollments est une propriété de navigation. Une entité Course peut être associée à un nombre quelconque d’entités Enrollment.

Nous allons en savoir plus sur la [DatabaseGenerated(DatabaseGeneratedOption). Attribut None)] dans le tutoriel suivant. En fait, cet attribut vous permet d’entrer la clé primaire pour le cours plutôt que de laisser la base de données la générer.

Créer le contexte de base de données

La classe principale qui coordonne les fonctionnalités Entity Framework pour un modèle de données donné est la classe de contexte de base de données. Vous créez cette classe en dérivant de la classe System.Data.Entity.DbContext . Dans votre code, vous spécifiez les entités qui sont incluses dans le modèle de données. Vous pouvez également personnaliser un certain comportement d’Entity Framework. Dans ce projet, la classe est nommée SchoolContext.

Créez un dossier nommé DAL (pour la couche d’accès aux données). Dans ce dossier, créez un fichier de classe nommé SchoolContext.cs et remplacez le code existant par le code suivant :

using ContosoUniversity.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace ContosoUniversity.DAL
{
    public class SchoolContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

Ce code crée une propriété DbSet pour chaque jeu d’entités. Dans la terminologie Entity Framework, un jeu d’entités correspond généralement à une table de base de données et une entité correspond à une ligne de la table.

L’instruction modelBuilder.Conventions.Remove de la méthode OnModelCreating empêche les noms de tables d’être pluralisés. Si vous ne l’avez pas fait, les tables générées sont nommées Students, Courseset Enrollments. Au lieu de cela, les noms de table seront Student, Courseet Enrollment. Les développeurs ne sont pas tous d’accord sur la nécessité d’utiliser des noms de table au pluriel. Ce tutoriel utilise le formulaire singulier, mais le point important est que vous pouvez sélectionner le formulaire que vous préférez en incluant ou en omettant cette ligne de code.

Base de données locale SQL Server Express

LocalDB est une version légère de SQL Server Express Moteur de base de données qui démarre à la demande et s’exécute en mode utilisateur. LocalDB s’exécute en mode d’exécution spécial de SQL Server Express qui vous permet d’utiliser des bases de données en tant que fichiers .mdf . En règle générale, les fichiers de base de données LocalDB sont conservés dans le dossier App_Data d’un projet web. La fonctionnalité d’instance utilisateur dans SQL Server Express vous permet également d’utiliser des fichiers .mdf , mais la fonctionnalité d’instance utilisateur est déconseillée. Par conséquent, LocalDB est recommandé pour utiliser des fichiers .mdf .

En règle générale, SQL Server Express n’est pas utilisé pour les applications web de production. LocalDB en particulier n’est pas recommandé pour une utilisation en production avec une application web, car elle n’est pas conçue pour fonctionner avec IIS.

Dans Visual Studio 2012 et versions ultérieures, LocalDB est installé par défaut avec Visual Studio. Dans Visual Studio 2010 et versions antérieures, SQL Server Express (sans LocalDB) est installé par défaut avec Visual Studio ; vous devez l’installer manuellement si vous utilisez Visual Studio 2010.

Dans ce tutoriel, vous allez utiliser LocalDB pour que la base de données puisse être stockée dans le dossier App_Data sous la forme d’un fichier .mdf . Ouvrez le fichier Web.config racine et ajoutez une nouvelle chaîne de connexion à la connectionStrings collection, comme illustré dans l’exemple suivant. (Veillez à mettre à jour le Fichier Web.config dans le dossier du projet racine. Il existe également un fichier Web.config dans le sous-dossier Views que vous n’avez pas besoin de mettre à jour.)

<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\ContosoUniversity.mdf" providerName="System.Data.SqlClient" />

Par défaut, Entity Framework recherche une chaîne de connexion nommée la même que la DbContext classe (SchoolContextpour ce projet). La chaîne de connexion que vous avez ajoutée spécifie une base de données LocalDB nommée ContosoUniversity.mdf située dans le dossier App_Data. Pour plus d’informations, consultez les chaînes de connexion SQL Server pour ASP.NET applications web.

Vous n’avez pas réellement besoin de spécifier la chaîne de connexion. Si vous ne fournissez pas de chaîne de connexion, Entity Framework en crée un pour vous. Toutefois, la base de données ne figure peut-être pas dans le dossier App_data de votre application. Pour plus d’informations sur l’emplacement de création de la base de données, consultez Code First vers une nouvelle base de données.

La connectionStrings collection a également un chaîne de connexion nommé DefaultConnection qui est utilisé pour la base de données d’appartenance. Vous n’utiliserez pas la base de données d’appartenance dans ce didacticiel. La seule différence entre les deux chaîne de connexion est le nom de la base de données et la valeur d’attribut de nom.

Configurer et exécuter une migration code first

Lorsque vous commencez à développer une application, votre modèle de données change fréquemment et chaque fois que le modèle change, il est synchronisé avec la base de données. Vous pouvez configurer Entity Framework pour supprimer et recréer automatiquement la base de données chaque fois que vous modifiez le modèle de données. Ce n’est pas un problème au début du développement, car les données de test sont facilement recrées, mais une fois que vous avez déployé en production, vous souhaitez généralement mettre à jour le schéma de base de données sans supprimer la base de données. La fonctionnalité Migrations permet au code First de mettre à jour la base de données sans la supprimer et la recréer. Au début du cycle de développement d’un nouveau projet, vous pouvez utiliser DropCreateDatabaseIfModelChanges pour supprimer, recréer et recréer la base de données chaque fois que le modèle change. Vous êtes prêt à déployer votre application, vous pouvez effectuer une conversion vers l’approche des migrations. Pour ce tutoriel, vous n’utiliserez que les migrations. Pour plus d’informations, consultez Migrations Code First et migrations Screencast Series.

Activation de Code First Migrations

  1. Dans le menu Outils, cliquez sur Gestionnaire de package NuGet, puis sur Console du Gestionnaire de package.

    Selecting_Package_Manager_Console

  2. À l’invite PM> , entrez la commande suivante :

    enable-migrations -contexttypename SchoolContext
    

    commande enable-migrations

    Cette commande crée un dossier Migrations dans le projet ContosoUniversity et place dans ce dossier un fichier Configuration.cs que vous pouvez modifier pour configurer les migrations.

    Dossier migrations

    La Configuration classe inclut une Seed méthode appelée lorsque la base de données est créée et chaque fois qu’elle est mise à jour après une modification d’un modèle de données.

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.Models.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    
        protected override void Seed(ContosoUniversity.Models.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
    

    L’objectif de cette Seed méthode est de vous permettre d’insérer des données de test dans la base de données après que Code First l’a créée ou la met à jour.

Configurer la méthode Seed

La méthode Seed s’exécute quand Migrations Code First crée la base de données et chaque fois qu’elle met à jour la base de données vers la dernière migration. L’objectif de la méthode Seed est de vous permettre d’insérer des données dans vos tables avant que l’application accède à la base de données pour la première fois.

Dans les versions antérieures de Code First, avant la publication des migrations, il était courant d’insérer Seed des données de test, car chaque modification de modèle lors du développement de la base de données devait être complètement supprimée et recréée à partir de zéro. Avec Migrations Code First, les données de test sont conservées après les modifications de base de données. Par conséquent, l’inclusion de données de test dans la méthode Seed n’est généralement pas nécessaire. En fait, vous ne souhaitez pas que la Seed méthode insère des données de test si vous utiliserez Migrations pour déployer la base de données en production, car la Seed méthode s’exécutera en production. Dans ce cas, vous souhaitez que la Seed méthode soit insérée dans la base de données uniquement les données que vous souhaitez insérer en production. Par exemple, vous souhaiterez peut-être que la base de données inclue des noms de service réels dans la Department table lorsque l’application devient disponible en production.

Pour ce tutoriel, vous allez utiliser migrations pour le déploiement, mais votre Seed méthode insère des données de test de toute façon afin de faciliter le fonctionnement de la fonctionnalité d’application sans avoir à insérer manuellement un grand nombre de données.

  1. Remplacez le contenu du fichier Configuration.cs par le code suivant, qui charge les données de test dans la nouvelle base de données.

    namespace ContosoUniversity.Migrations
    {
       using System;
       using System.Collections.Generic;
       using System.Data.Entity.Migrations;
       using System.Linq;
       using ContosoUniversity.Models;
    
       internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
       {
          public Configuration()
          {
             AutomaticMigrationsEnabled = false;
          }
    
          protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
          {
             var students = new List<Student>
                {
                    new Student { FirstMidName = "Carson",   LastName = "Alexander", 
                        EnrollmentDate = DateTime.Parse("2010-09-01") },
                    new Student { FirstMidName = "Meredith", LastName = "Alonso",    
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Arturo",   LastName = "Anand",     
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", 
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Yan",      LastName = "Li",        
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Peggy",    LastName = "Justice",   
                        EnrollmentDate = DateTime.Parse("2011-09-01") },
                    new Student { FirstMidName = "Laura",    LastName = "Norman",    
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Nino",     LastName = "Olivetto",  
                        EnrollmentDate = DateTime.Parse("2005-08-11") }
                };
             students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
             context.SaveChanges();
    
             var courses = new List<Course>
                {
                    new Course {CourseID = 1050, Title = "Chemistry",      Credits = 3, },
                    new Course {CourseID = 4022, Title = "Microeconomics", Credits = 3, },
                    new Course {CourseID = 4041, Title = "Macroeconomics", Credits = 3, },
                    new Course {CourseID = 1045, Title = "Calculus",       Credits = 4, },
                    new Course {CourseID = 3141, Title = "Trigonometry",   Credits = 4, },
                    new Course {CourseID = 2021, Title = "Composition",    Credits = 3, },
                    new Course {CourseID = 2042, Title = "Literature",     Credits = 4, }
                };
             courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s));
             context.SaveChanges();
    
             var enrollments = new List<Enrollment>
                {
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").StudentID, 
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
                        Grade = Grade.A 
                    },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").StudentID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, 
                        Grade = Grade.C 
                     },                            
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").StudentID,
                        CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, 
                        Grade = Grade.B
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").StudentID,
                        CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").StudentID,
                        CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment {
                        StudentID = students.Single(s => s.LastName == "Alonso").StudentID,
                        CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").StudentID,
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").StudentID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
                        Grade = Grade.B         
                     },
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Barzdukas").StudentID,
                        CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Li").StudentID,
                        CourseID = courses.Single(c => c.Title == "Composition").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Justice").StudentID,
                        CourseID = courses.Single(c => c.Title == "Literature").CourseID,
                        Grade = Grade.B         
                     }
                };
    
             foreach (Enrollment e in enrollments)
             {
                var enrollmentInDataBase = context.Enrollments.Where(
                    s =>
                         s.Student.StudentID == e.StudentID &&
                         s.Course.CourseID == e.CourseID).SingleOrDefault();
                if (enrollmentInDataBase == null)
                {
                   context.Enrollments.Add(e);
                }
             }
             context.SaveChanges();
          }
       }
    }
    

    La méthode Seed prend l’objet de contexte de base de données comme paramètre d’entrée, et le code de la méthode utilise cet objet pour ajouter de nouvelles entités à la base de données. Pour chaque type d’entité, le code crée une collection d’entités, les ajoute à la propriété DbSet appropriée, puis enregistre les modifications apportées à la base de données. Il n’est pas nécessaire d’appeler la méthode SaveChanges après chaque groupe d’entités, comme indiqué ici, mais cela vous aide à localiser la source d’un problème si une exception se produit pendant l’écriture du code dans la base de données.

    Certaines instructions qui insèrent des données utilisent la méthode AddOrUpdate pour effectuer une opération « upsert ». Étant donné que la Seed méthode s’exécute avec chaque migration, vous ne pouvez pas simplement insérer des données, car les lignes que vous essayez d’ajouter seront déjà là après la première migration qui crée la base de données. L’opération « upsert » empêche les erreurs qui se produisent si vous essayez d’insérer une ligne qui existe déjà, mais elle remplace les modifications apportées aux données que vous avez peut-être effectuées lors du test de l’application. Avec les données de test dans certaines tables, vous ne souhaiterez peut-être pas que cela se produise : dans certains cas, lorsque vous modifiez des données lors du test, vous souhaitez que vos modifications restent après les mises à jour de la base de données. Dans ce cas, vous souhaitez effectuer une opération d’insertion conditionnelle : insérez une ligne uniquement si elle n’existe pas déjà. La méthode Seed utilise les deux approches.

    Le premier paramètre passé à la méthode AddOrUpdate spécifie la propriété à utiliser pour vérifier si une ligne existe déjà. Pour les données d’étudiant de test que vous fournissez, la LastName propriété peut être utilisée à cet effet, car chaque nom de famille de la liste est unique :

    context.Students.AddOrUpdate(p => p.LastName, s)
    

    Ce code suppose que les noms de famille sont uniques. Si vous ajoutez manuellement un étudiant avec un nom de famille en double, vous obtenez l’exception suivante la prochaine fois que vous effectuez une migration.

    Sequence contient plusieurs éléments

    Pour plus d’informations sur la AddOrUpdate méthode, consultez La méthode AddOrUpdate EF 4.3 sur le blog de Julie Lerman.

    Le code qui ajoute des Enrollment entités n’utilise pas la AddOrUpdate méthode. Elle vérifie si une entité existe déjà et insère l’entité si elle n’existe pas. Cette approche conserve les modifications que vous apportez à une classe d’inscription lors de l’exécution des migrations. Le code effectue une boucle dans chaque membre de la Enrollmentliste et, si l’inscription est introuvable dans la base de données, elle ajoute l’inscription à la base de données. La première fois que vous mettez à jour la base de données, la base de données sera vide, de sorte qu’elle ajoutera chaque inscription.

    foreach (Enrollment e in enrollments)
    {
        var enrollmentInDataBase = context.Enrollments.Where(
            s => s.Student.StudentID == e.Student.StudentID &&
                 s.Course.CourseID == e.Course.CourseID).SingleOrDefault();
        if (enrollmentInDataBase == null)
        {
            context.Enrollments.Add(e);
        }
    }
    

    Pour plus d’informations sur la façon de déboguer la Seed méthode et comment gérer des données redondantes telles que deux étudiants nommés « Alexander Carson », consultez amorçage et débogage des bases de données Entity Framework (EF) sur le blog de Rick Anderson.

  2. Créez le projet.

Créer et exécuter la première migration

  1. Dans la fenêtre Gestionnaire de package console, entrez les commandes suivantes :

    add-migration InitialCreate
    update-database
    

    Capture d’écran montrant la fenêtre Gestionnaire de package Console. Les commandes ajoutent un trait de soulignement initial de migration de traits d’union et mettent à jour la base de données de traits d’union.

    La add-migration commande ajoute au dossier Migrations un fichier [DateStamp]_InitialCreate.cs qui contient du code qui crée la base de données. Le premier paramètre (InitialCreate) est utilisé pour le nom de fichier et peut être ce que vous souhaitez ; vous choisissez généralement un mot ou une expression qui résume ce qui est effectué dans la migration. Par exemple, vous pouvez nommer une migration ultérieure « AjouterTableDépartement ».

    Dossier migrations avec migration initiale

    La Up méthode de la InitialCreate classe crée les tables de base de données qui correspondent aux jeux d’entités de modèle de données, et la Down méthode les supprime. La fonctionnalité Migrations appelle la méthode Up pour implémenter les modifications du modèle de données pour une migration. Quand vous entrez une commande pour annuler la mise à jour, Migrations appelle la méthode Down. Le code suivant montre le contenu du InitialCreate fichier :

    namespace ContosoUniversity.Migrations
    {
        using System;
        using System.Data.Entity.Migrations;
        
        public partial class InitialCreate : DbMigration
        {
            public override void Up()
            {
                CreateTable(
                    "dbo.Student",
                    c => new
                        {
                            StudentID = c.Int(nullable: false, identity: true),
                            LastName = c.String(),
                            FirstMidName = c.String(),
                            EnrollmentDate = c.DateTime(nullable: false),
                        })
                    .PrimaryKey(t => t.StudentID);
                
                CreateTable(
                    "dbo.Enrollment",
                    c => new
                        {
                            EnrollmentID = c.Int(nullable: false, identity: true),
                            CourseID = c.Int(nullable: false),
                            StudentID = c.Int(nullable: false),
                            Grade = c.Int(),
                        })
                    .PrimaryKey(t => t.EnrollmentID)
                    .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true)
                    .ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true)
                    .Index(t => t.CourseID)
                    .Index(t => t.StudentID);
                
                CreateTable(
                    "dbo.Course",
                    c => new
                        {
                            CourseID = c.Int(nullable: false),
                            Title = c.String(),
                            Credits = c.Int(nullable: false),
                        })
                    .PrimaryKey(t => t.CourseID);
                
            }
            
            public override void Down()
            {
                DropIndex("dbo.Enrollment", new[] { "StudentID" });
                DropIndex("dbo.Enrollment", new[] { "CourseID" });
                DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student");
                DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course");
                DropTable("dbo.Course");
                DropTable("dbo.Enrollment");
                DropTable("dbo.Student");
            }
        }
    }
    

    La update-database commande exécute la Up méthode pour créer la base de données, puis elle exécute la Seed méthode pour remplir la base de données.

Une base de données SQL Server a été créée pour votre modèle de données. Le nom de la base de données est ContosoUniversity et le fichier .mdf se trouve dans le dossier App_Data de votre projet, car c’est ce que vous avez spécifié dans votre chaîne de connexion.

Vous pouvez utiliser l’Explorateur de serveurs ou l’Explorateur d’objets SQL Server (SSOX) pour afficher la base de données dans Visual Studio. Pour ce tutoriel, vous allez utiliser l’Explorateur de serveurs. Dans Visual Studio Express 2012 pour Web, l’Explorateur de serveurs est appelé Explorateur de bases de données.

  1. Dans le menu Affichage , cliquez sur Explorateur de serveurs.

  2. Cliquez sur l’icône Ajouter une connexion .

    Capture d’écran montrant la fenêtre Explorateur de bases de données. L’icône Ajouter une connexion est mise en surbrillance.

  3. Si vous êtes invité à utiliser la boîte de dialogue Choisir une source de données, cliquez sur Microsoft SQL Server, puis sur Continuer.

    Capture d’écran montrant la boîte de dialogue Choisir une source de données. La source de données Microsoft S Q L Server est sélectionnée.

  4. Dans la boîte de dialogue Ajouter une connexion, entrez (localdb)\v11.0 pour le nom du serveur. Sous Sélectionner ou entrer un nom de base de données, sélectionnez ContosoUniversity.

    Capture d’écran montrant la boîte de dialogue Ajouter une connexion. L’exemple de nom du serveur et de la base de données Contoso University sont mis en surbrillance.

  5. Cliquez sur OK.

  6. Développez SchoolContext , puis développez Tables.

    Capture d’écran montrant la page Explorateur de serveurs. Les onglets Contexte scolaire et Tables sont développés.

  7. Cliquez avec le bouton droit sur la table Student , puis cliquez sur Afficher les données de table pour afficher les colonnes créées et les lignes insérées dans la table.

    Table Étudiant

Création d’un contrôleur étudiant et de vues

L’étape suivante consiste à créer un contrôleur et des vues MVC ASP.NET dans votre application qui peuvent fonctionner avec l’une de ces tables.

  1. Pour créer un Student contrôleur, cliquez avec le bouton droit sur le dossier Contrôleurs dans Explorateur de solutions, sélectionnez Ajouter, puis cliquez sur Contrôleur. Dans la boîte de dialogue Ajouter un contrôleur , effectuez les sélections suivantes, puis cliquez sur Ajouter :

    • Nom du contrôleur : StudentController.

    • Modèle : contrôleur MVC avec des actions et des vues en lecture/écriture, à l’aide d’Entity Framework.

    • Classe de modèle : Étudiant (ContosoUniversity.Models). (Si vous ne voyez pas cette option dans la liste déroulante, générez le projet et réessayez.)

    • Classe de contexte de données : SchoolContext (ContosoUniversity.Models).

    • Vues : Razor (CSHTML). (Valeur par défaut.)

      Add_Controller_dialog_box_for_Student_controller

  2. Visual Studio ouvre le fichier Controllers\StudentController.cs . Vous voyez qu’une variable de classe a été créée qui instancie un objet de contexte de base de données :

    private SchoolContext db = new SchoolContext();
    

    La Index méthode d’action obtient une liste d’étudiants de l’entité Students définie en lisant la Students propriété de l’instance de contexte de base de données :

    public ViewResult Index()
    {
        return View(db.Students.ToList());
    }
    

    La vue Student\Index.cshtml affiche cette liste dans un tableau :

    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.LastName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.FirstMidName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.EnrollmentDate)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
                @Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
            </td>
        </tr>
    }
    
  3. Appuyez sur CTRL+F5 pour exécuter le projet.

    Cliquez sur l’onglet Étudiants pour afficher les données de test que la Seed méthode a insérées.

    Page Index des étudiants

Conventions

La quantité de code que vous deviez écrire pour que Entity Framework puisse créer une base de données complète pour vous est minimale en raison de l’utilisation de conventions, ou des hypothèses que Entity Framework effectue. Certains d’entre eux ont déjà été notés :

  • Les formes pluralisées de noms de classes d’entité sont utilisées comme noms de table.
  • Les noms des propriétés d’entités sont utilisés comme noms de colonnes.
  • Les propriétés d’entité nommées ID ou classname ID sont reconnues comme propriétés de clé primaire.

Vous avez vu que les conventions peuvent être remplacées (par exemple, vous avez spécifié que les noms de tables ne doivent pas être pluralisés), et vous en apprendrez davantage sur les conventions et comment les remplacer dans le didacticiel Création d’un modèle de données plus complexe plus loin dans cette série. Pour plus d’informations, consultez Code First Conventions.

Résumé

Vous avez maintenant créé une application simple qui utilise Entity Framework et SQL Server Express pour stocker et afficher des données. Dans le tutoriel suivant, vous allez apprendre à effectuer des opérations CRUD de base (créer, lire, mettre à jour, supprimer). Vous pouvez laisser des commentaires en bas de cette page. Veuillez nous informer de la façon dont vous avez aimé cette partie du didacticiel et comment nous pourrions l’améliorer.

Vous trouverez des liens vers d’autres ressources Entity Framework dans la carte de contenu d’accès aux données ASP.NET.