Didacticiel : prise en main de Entity Framework 6 Code First à l’aide de MVC 5Tutorial: Get Started with Entity Framework 6 Code First using MVC 5

Note

Pour les nouveaux développements, nous vous recommandons de ASP.NET Core Razor pages sur les contrôleurs et les vues MVC ASP.net.For new development, we recommend ASP.NET Core Razor Pages over ASP.NET MVC controllers and views. Pour obtenir une série de didacticiels similaire à celle-ci à l’aide de Razor Pages, consultez Didacticiel : prise en main de Razor pages dans ASP.net Core.For a tutorial series similar to this one using Razor Pages, see Tutorial: Get started with Razor Pages in ASP.NET Core. Le nouveau didacticiel :The new tutorial:

  • est plus facile à suivre ;Is easier to follow.
  • Fournit d’autres bonnes pratiques sur EF Core.Provides more EF Core best practices.
  • Utilise des requêtes plus efficaces.Uses more efficient queries.
  • Est plus à jour avec la dernière API.Is more current with the latest API.
  • couvre davantage de fonctionnalités ;Covers more features.
  • représente la meilleure approche pour le développement de nouvelles applications.Is the preferred approach for new application development.

Dans cette série de didacticiels, vous allez apprendre à créer une application ASP.NET MVC 5 qui utilise Entity Framework 6 pour accéder aux données.In this series of tutorials, you learn how to build an ASP.NET MVC 5 application that uses Entity Framework 6 for data access. Ce didacticiel utilise le flux de travail Code First.This tutorial uses the Code First workflow. Pour plus d’informations sur le choix entre Code First, Database First et Model First, consultez créer un modèle.For information about how to choose between Code First, Database First, and Model First, see Create a model.

Cette série de didacticiels explique comment créer l’exemple d’application Contoso University.This tutorial series explains how to build the Contoso University sample application. L’exemple d’application est un simple site Web universitaire.The sample application is a simple university website. Il vous permet d’afficher et de mettre à jour les informations relatives aux étudiants, aux cours et aux enseignants.With it, you can view and update student, course, and instructor information. Voici deux des écrans que vous créez :Here are two of the screens you create:

Students_Index_page

Modifier le Student

Dans ce didacticiel, vous avez effectué les actions suivantes :In this tutorial, you:

  • Créer une application Web MVCCreate an MVC web app
  • Définir le style de siteSet up the site style
  • Installer Entity Framework 6Install Entity Framework 6
  • Créer le modèle de donnéesCreate the data model
  • Créer le contexte de base de donnéesCreate the database context
  • Initialiser la base de données avec des données de testInitialize DB with test data
  • Configurer EF 6 pour utiliser la base de données localeSet up EF 6 to use LocalDB
  • Créer un contrôleur et des vuesCreate controller and views
  • Afficher la base de donnéesView the database

Conditions préalables requisesPrerequisites

Créer une application Web MVCCreate an MVC web app

  1. Ouvrez Visual Studio et créez un C# projet Web à l’aide du modèle d' application web ASP.net (.NET Framework) .Open Visual Studio and create a C# web project using the ASP.NET Web Application (.NET Framework) template. Nommez le projet ContosoUniversity et sélectionnez OK.Name the project ContosoUniversity and select OK.

    Boîte de dialogue Nouveau projet dans Visual Studio

  2. Dans nouvelle application Web ASP.net-ContosoUniversity, sélectionnez MVC.In New ASP.NET Web Application - ContosoUniversity, select MVC.

    Boîte de dialogue nouvelle application Web dans Visual Studio

    Note

    Par défaut, l’option d’authentification est définie sur aucune authentification.By default, the Authentication option is set to No Authentication. Pour ce didacticiel, l’application Web ne requiert pas que les utilisateurs se connectent.For this tutorial, the web app doesn't require users to sign in. En outre, il ne limite pas l’accès en fonction de la personne qui est connectée.Also, it doesn't restrict access based on who's signed in.

  3. Sélectionnez OK pour créer le projet.Select OK to create the project.

Définir le style de siteSet up the site style

Quelques changements simples configureront le menu, la disposition et la page d’accueil du site.A few simple changes will set up the site menu, layout, and home page.

  1. Ouvrez Views\Shared\_Layout. cshtmlet apportez les modifications suivantes :Open Views\Shared\_Layout.cshtml, and make the following changes:

    • Remplacez chaque occurrence de « mon application ASP.NET » et « nom de l’application » par « Contoso University ».Change each occurrence of "My ASP.NET Application" and "Application name" to "Contoso University".
    • Ajoutez des entrées de menu pour les élèves, les cours, les enseignants et les services, puis supprimez l’entrée de contact.Add menu entries for Students, Courses, Instructors, and Departments, and delete the Contact entry.

    Les modifications sont mises en surbrillance dans l’extrait de code suivant :The changes are highlighted in the following code snippet:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Contoso University</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="navbar-inner">
                <div class="container">
                    <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("Contoso University", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
                    <div class="nav-collapse collapse">
                        <ul class="nav">
                            <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>
                    </div>
                </div>
            </div>
        </div>
    
        <div class="container">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - Contoso University</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html>
    
  2. Dans Views\Home\Index.cshtml, remplacez le contenu du fichier par le code suivant pour remplacer le texte sur ASP.net et MVC par le texte de cette application :In Views\Home\Index.cshtml, replace the contents of the file with the following code to replace the text about ASP.NET and MVC with text about this application:

    @{
        ViewBag.Title = "Home Page";
    }
    
    <div class="jumbotron">
        <h1>Contoso University</h1>
    </div>
    <div class="row">
        <div class="col-md-4">
            <h2>Welcome to Contoso University</h2>
            <p>Contoso University is a sample application that
            demonstrates how to use Entity Framework 6 in an 
            ASP.NET MVC 5 web application.</p>
        </div>
        <div class="col-md-4">
            <h2>Build it from scratch</h2>
            <p>You can build the application by following the steps in the tutorial series on the ASP.NET site.</p>
            <p><a class="btn btn-default" href="http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/">See the tutorial &raquo;</a></p>
        </div>
        <div class="col-md-4">
            <h2>Download it</h2>
            <p>You can download the completed project.</p>
            <p><a class="btn btn-default" href="https://webpifeed.blob.core.windows.net/webpifeed/Partners/ASP.NET%20MVC%20Application%20Using%20Entity%20Framework%20Code%20First.zip">Download &raquo;</a></p>
        </div>
    </div>
    
  3. Appuyez sur CTRL + F5 pour exécuter le site Web.Press Ctrl+F5 to run the web site. La page d’accueil s’affiche avec le menu principal.You see the home page with the main menu.

Installer Entity Framework 6Install Entity Framework 6

  1. Dans le menu Outils , choisissez Gestionnaire de package NuGet, puis console du gestionnaire de package.From the Tools menu, choose NuGet Package Manager, and then choose Package Manager Console.

  2. Dans la fenêtre Console du Gestionnaire de package , entrez la commande suivante :In the Package Manager Console window, enter the following command:

    Install-Package EntityFramework
    

Cette étape est l’une des étapes que ce didacticiel vous propose manuellement, mais qui aurait pu être effectuée automatiquement par la fonctionnalité de génération de modèles automatique ASP.NET MVC.This step is one of a few steps that this tutorial has you do manually, but that could have been done automatically by the ASP.NET MVC scaffolding feature. Vous les exécutez manuellement pour voir les étapes nécessaires à l’utilisation d’Entity Framework (EF).You're doing them manually so that you can see the steps required to use Entity Framework (EF). Vous utiliserez la génération de modèles automatique ultérieurement pour créer le contrôleur MVC et les vues.You'll use scaffolding later to create the MVC controller and views. Une alternative consiste à laisser la structure installer automatiquement le package NuGet EF, créer la classe de contexte de base de données et créer la chaîne de connexion.An alternative is to let scaffolding automatically install the EF NuGet package, create the database context class, and create the connection string. Lorsque vous êtes prêt à effectuer cette opération, il vous suffit d’ignorer ces étapes et de générer un modèle de structure pour votre contrôleur MVC après avoir créé vos classes d’entité.When you're ready to do it that way, all you have to do is skip those steps and scaffold your MVC controller after you create your entity classes.

Créer le modèle de donnéesCreate the data model

Ensuite, vous allez créer des classes d’entités pour l’application Contoso University.Next you'll create entity classes for the Contoso University application. Vous allez commencer par les trois entités suivantes :You'll start with the following three entities:

Cours <-> inscription <-> étudiantCourse <-> Enrollment <-> Student

EntitésEntities RelationshipRelationship
Cours d’inscriptionCourse to Enrollment Un-à-plusieursOne-to-many
Étudiants à inscrireStudent to Enrollment Un-à-plusieursOne-to-many

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.There's a one-to-many relationship between Student and Enrollment entities, and there's a one-to-many relationship between Course and Enrollment entities. 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.In other words, a student can be enrolled in any number of courses, and a course can have any number of students enrolled in it.

Dans les sections suivantes, vous allez créer une classe pour chacune de ces entités.In the following sections, you'll create a class for each one of these entities.

Note

Si vous essayez de compiler le projet avant de terminer la création de toutes ces classes d’entité, vous obtiendrez des erreurs de compilation.If you try to compile the project before you finish creating all of these entity classes, you'll get compiler errors.

Entité StudentThe Student entity

  • Dans le dossier Models , créez un fichier de classe nommé Student.cs en cliquant avec le bouton droit sur le dossier dans Explorateur de solutions et en choisissant Ajouter > classe.In the Models folder, create a class file named Student.cs by right-clicking on the folder in Solution Explorer and choosing Add > Class. Remplacez le code du modèle par le code suivant :Replace the template code with the following code:

    using System;
    using System.Collections.Generic;
    
    namespace ContosoUniversity.Models
    {
        public class Student
        {
            public int ID { 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é ID devient la colonne de clé primaire de la table de base de données qui correspond à cette classe.The ID property will become the primary key column of the database table that corresponds to this class. Par défaut, Entity Framework interprète une propriété nommée ID ou classname ID comme clé primaire.By default, Entity Framework interprets a property that's named ID or classname ID as the primary key.

La propriété Enrollments est une propriété de navigation.The Enrollments property is a navigation property. Les propriétés de navigation contiennent d’autres entités qui sont associées à cette entité.Navigation properties hold other entities that are related to this entity. Dans ce cas, la propriété Enrollments d’une entité Student contiendra toutes les entités Enrollment associées à cette Student entité.In this case, the Enrollments property of a Student entity will hold all of the Enrollment entities that are related to that Student entity. En d’autres termes, si une ligne de Student donnée dans la base de données a deux lignes Enrollment associées (lignes qui contiennent la valeur de clé primaire de cet étudiant dans leur colonne de clé étrangère StudentID), cette propriété de navigation Enrollments de l’entité Student contient ces deux entités Enrollment.In other words, if a given Student row in the database has two related Enrollment rows (rows that contain that student's primary key value in their StudentID foreign key column), that Student entity's Enrollments navigation property will contain those two Enrollment entities.

Les propriétés de navigation sont généralement définies comme virtual afin qu’elles puissent tirer parti de certaines fonctionnalités Entity Framework telles que le chargement différé.Navigation properties are typically defined as virtual so that they can take advantage of certain Entity Framework functionality such as lazy loading. (Le chargement différé sera expliqué ultérieurement, dans le didacticiel sur la lecture des données associées plus loin dans cette série.)(Lazy loading will be explained later, in the Reading Related Data tutorial later in this series.)

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.If a navigation property can hold multiple entities (as in many-to-many or one-to-many relationships), its type must be a list in which entries can be added, deleted, and updated, such as ICollection.

L’entité EnrollmentThe Enrollment entity

  • Dans le dossier Models, créez Enrollment.cs et remplacez le code existant par le code suivant :In the Models folder, create Enrollment.cs and replace the existing code with the following code:

    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é EnrollmentID est la clé primaire ; cette entité utilise le modèle de ID className au lieu de ID comme vous l’avez vu dans l’entité Student.The EnrollmentID property will be the primary key; this entity uses the classname ID pattern instead of ID by itself as you saw in the Student entity. En général, vous choisissez un modèle et l’utilisez dans tout votre modèle de données.Ordinarily you would choose one pattern and use it throughout your data model. Ici, la variante illustre que vous pouvez utiliser l’un ou l’autre modèle.Here, the variation illustrates that you can use either pattern. Dans un didacticiel ultérieur, vous verrez comment l’utilisation de ID sans classname facilite l’implémentation de l’héritage dans le modèle de données.In a later tutorial, you'll see how using ID without classname makes it easier to implement inheritance in the data model.

La propriété Grade est une énumération.The Grade property is an enum. La présence du point d’interrogation après la déclaration de type Grade indique que la propriété Gradeaccepte les valeurs Null.The question mark after the Grade type declaration indicates that the Grade property is nullable. Un niveau null est différent d’un niveau zéro (null signifie qu’un niveau n’est pas connu ou n’a pas encore été affecté).A grade that's null is different from a zero grade — null means a grade isn't known or hasn't been assigned yet.

La propriété StudentID est une clé étrangère et la propriété de navigation correspondante est Student.The StudentID property is a foreign key, and the corresponding navigation property is 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).An Enrollment entity is associated with one Student entity, so the property can only hold a single Student entity (unlike the Student.Enrollments navigation property you saw earlier, which can hold multiple Enrollment entities).

La propriété CourseID est une clé étrangère et la propriété de navigation correspondante est Course.The CourseID property is a foreign key, and the corresponding navigation property is Course. Une entité Enrollment est associée à une entité Course.An Enrollment entity is associated with one Course entity.

Entity Framework interprète une propriété comme une propriété de clé étrangère si elle est nommée <nom de la propriété de navigation><nom de la propriété de clé primaire> (par exemple, StudentID pour la propriété de navigation Student, car la clé primaire de l’entité Student est ID).Entity Framework interprets a property as a foreign key property if it's named <navigation property name><primary key property name> (for example, StudentID for the Student navigation property since the Student entity's primary key is ID). Les propriétés de clé étrangère peuvent également être nommées de la même façon <nom de propriété de clé primaire> (par exemple, CourseID depuis la CourseIDde la clé primaire de l’entité Course).Foreign key properties can also be named the same simply <primary key property name> (for example, CourseID since the Course entity's primary key is CourseID).

Entité CourseThe Course entity

  • Dans le dossier Models , créez course.cs, en remplaçant le code du modèle par le code suivant :In the Models folder, create Course.cs, replacing the template code with the following code:

    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.The Enrollments property is a navigation property. Une entité Course peut être associée à un nombre quelconque d’entités Enrollment.A Course entity can be related to any number of Enrollment entities.

Vous en apprendrez davantage sur l’attribut DatabaseGeneratedAttribute dans un didacticiel ultérieur de cette série.We'll say more about the DatabaseGeneratedAttribute attribute in a later tutorial in this series. 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.Basically, this attribute lets you enter the primary key for the course rather than having the database generate it.

Créer le contexte de base de donnéesCreate the database context

La classe principale qui coordonne Entity Framework fonctionnalité pour un modèle de données donné est la classe de contexte de base de données .The main class that coordinates Entity Framework functionality for a given data model is the database context class. Vous créez cette classe en dérivant de la classe System. Data. Entity. DbContext .You create this class by deriving from the System.Data.Entity.DbContext class. Dans votre code, vous spécifiez les entités qui sont incluses dans le modèle de données.In your code, you specify which entities are included in the data model. Vous pouvez également personnaliser un certain comportement d’Entity Framework.You can also customize certain Entity Framework behavior. Dans ce projet, la classe se nomme SchoolContext.In this project, the class is named SchoolContext.

  • Pour créer un dossier dans le projet ContosoUniversity, cliquez avec le bouton droit sur le projet dans Explorateur de solutions , cliquez sur Ajouter, puis sur nouveau dossier.To create a folder in the ContosoUniversity project, right-click the project in Solution Explorer and click Add, and then click New Folder. Nommez le nouveau dossier dal (pour la couche d’accès aux données).Name the new folder DAL (for Data Access Layer). Dans ce dossier, créez un fichier de classe nommé SchoolContext.cset remplacez le code du modèle par le code suivant :In that folder, create a new class file named SchoolContext.cs, and replace the template code with the following code:

    using ContosoUniversity.Models;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolContext : DbContext
        {
        
            public SchoolContext() : base("SchoolContext")
            {
            }
            
            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>();
            }
        }
    }
    

Spécifier les jeux d’entitésSpecify entity sets

Ce code crée une propriété DbSet pour chaque jeu d’entités.This code creates a DbSet property for each entity set. Dans Entity Framework terminologie, 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.In Entity Framework terminology, an entity set typically corresponds to a database table, and an entity corresponds to a row in the table.

Note

Vous pouvez omettre les instructions DbSet<Enrollment> et DbSet<Course> et cela fonctionnerait de la même façon.You can omit the DbSet<Enrollment> and DbSet<Course> statements and it would work the same. Entity Framework les inclurait implicitement parce que l’entité Student référence l’entité Enrollment et que l’entité Enrollment référence l’entité Course.Entity Framework would include them implicitly because the Student entity references the Enrollment entity and the Enrollment entity references the Course entity.

Spécifier la chaîne de connexionSpecify the connection string

Le nom de la chaîne de connexion (que vous ajouterez ultérieurement au fichier Web. config) est passé au constructeur.The name of the connection string (which you'll add to the Web.config file later) is passed in to the constructor.

public SchoolContext() : base("SchoolContext")
{
}

Vous pouvez également transmettre la chaîne de connexion elle-même au lieu du nom d’une chaîne stockée dans le fichier Web. config.You could also pass in the connection string itself instead of the name of one that is stored in the Web.config file. Pour plus d’informations sur les options permettant de spécifier la base de données à utiliser, consultez chaînes de connexion et modèles.For more information about options for specifying the database to use, see Connection strings and models.

Si vous ne spécifiez pas de chaîne de connexion ou le nom d’un explicitement, Entity Framework suppose que le nom de la chaîne de connexion est le même que le nom de la classe.If you don't specify a connection string or the name of one explicitly, Entity Framework assumes that the connection string name is the same as the class name. Dans cet exemple, le nom de la chaîne de connexion par défaut serait SchoolContext, ce qui correspond à ce que vous spécifiez explicitement.The default connection string name in this example would then be SchoolContext, the same as what you're specifying explicitly.

Spécifier des noms de tables singulièresSpecify singular table names

L’instruction modelBuilder.Conventions.Remove dans la méthode OnModelCreating empêche la pluralisation des noms de table.The modelBuilder.Conventions.Remove statement in the OnModelCreating method prevents table names from being pluralized. Si vous ne l’avez pas fait, les tables générées dans la base de données seraient nommées Students, Courseset Enrollments.If you didn't do this, the generated tables in the database would be named Students, Courses, and Enrollments. Au lieu de cela, les noms de table sont Student, Courseet Enrollment.Instead, the table names will be Student, Course, and Enrollment. Les développeurs ne sont pas tous d’accord sur la nécessité d’utiliser des noms de table au pluriel.Developers disagree about whether table names should be pluralized or not. Ce didacticiel utilise la forme singulière, 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.This tutorial uses the singular form, but the important point is that you can select whichever form you prefer by including or omitting this line of code.

Initialiser la base de données avec des données de testInitialize DB with test data

Entity Framework pouvez créer automatiquement (ou supprimer et recréer) une base de données lors de l’exécution de l’application.Entity Framework can automatically create (or drop and re-create) a database for you when the application runs. Vous pouvez spécifier que cette opération doit être effectuée chaque fois que votre application s’exécute ou uniquement lorsque le modèle n’est pas synchronisé avec la base de données existante.You can specify that this should be done every time your application runs or only when the model is out of sync with the existing database. Vous pouvez également écrire une méthode Seed qui Entity Framework appelle automatiquement après la création de la base de données afin de la remplir avec des données de test.You can also write a Seed method that Entity Framework automatically calls after creating the database in order to populate it with test data.

Le comportement par défaut consiste à créer une base de données uniquement si elle n’existe pas (et à lever une exception si le modèle a changé et que la base de données existe déjà).The default behavior is to create a database only if it doesn't exist (and throw an exception if the model has changed and the database already exists). Dans cette section, vous allez spécifier que la base de données doit être supprimée et recréée à chaque modification du modèle.In this section, you'll specify that the database should be dropped and re-created whenever the model changes. La suppression de la base de données entraîne la perte de toutes vos données.Dropping the database causes the loss of all your data. C’est généralement le cas lors du développement, car la méthode Seed s’exécute lorsque la base de données est recréée et recrée vos données de test.This is generally okay during development, because the Seed method will run when the database is re-created and will re-create your test data. En production, vous ne souhaitez généralement pas perdre toutes vos données chaque fois que vous devez modifier le schéma de base de données.But in production you generally don't want to lose all your data every time you need to change the database schema. Plus tard, vous verrez comment gérer les modifications de modèle à l’aide de Migrations Code First pour modifier le schéma de base de données au lieu de supprimer et de recréer la base de données.Later you'll see how to handle model changes by using Code First Migrations to change the database schema instead of dropping and re-creating the database.

  1. Dans le dossier DAL, créez un nouveau fichier de classe nommé SchoolInitializer.cs et remplacez le code du modèle par le code suivant, ce qui entraîne la création d’une base de données lorsque cela est nécessaire et charge les données de test dans la nouvelle base de données.In the DAL folder, create a new class file named SchoolInitializer.cs and replace the template code with the following code, which causes a database to be created when needed and loads test data into the new database.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using ContosoUniversity.Models;
    
    namespace ContosoUniversity.DAL
    {
        public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>
        {
            protected override void Seed(SchoolContext context)
            {
                var students = new List<Student>
                {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
                };
    
                students.ForEach(s => context.Students.Add(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.Add(s));
                context.SaveChanges();
                var enrollments = new List<Enrollment>
                {
                new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
                new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
                new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
                new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
                new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
                new Enrollment{StudentID=3,CourseID=1050},
                new Enrollment{StudentID=4,CourseID=1050,},
                new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
                new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
                new Enrollment{StudentID=6,CourseID=1045},
                new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
                };
                enrollments.ForEach(s => context.Enrollments.Add(s));
                context.SaveChanges();
            }
        }
    }
    

    La méthode Seed prend l’objet de contexte de base de données en tant que 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.The Seed method takes the database context object as an input parameter, and the code in the method uses that object to add new entities to the database. Pour chaque type d’entité, le code crée une collection de nouvelles entités, les ajoute à la propriété DbSet appropriée, puis enregistre les modifications dans la base de données.For each entity type, the code creates a collection of new entities, adds them to the appropriate DbSet property, and then saves the changes to the database. Il n’est pas nécessaire d’appeler la méthode SaveChanges après chaque groupe d’entités, comme cela est fait ici, mais cela vous permet de localiser la source d’un problème si une exception se produit pendant que le code écrit dans la base de données.It isn't necessary to call the SaveChanges method after each group of entities, as is done here, but doing that helps you locate the source of a problem if an exception occurs while the code is writing to the database.

  2. Pour indiquer à Entity Framework d’utiliser votre classe d’initialiseur, ajoutez un élément à l’élément entityFramework dans le fichier Web. config de l’application (celui qui se trouve dans le dossier racine du projet), comme indiqué dans l’exemple suivant :To tell Entity Framework to use your initializer class, add an element to the entityFramework element in the application Web.config file (the one in the root project folder), as shown in the following example:

    <entityFramework>
      <contexts>
        <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
          <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
        </context>
      </contexts>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    

    L' context type spécifie le nom complet de la classe de contexte et l’assembly dans lequel elle se trouve, et le databaseinitializer type spécifie le nom qualifié complet de la classe d’initialiseur et l’assembly dans lequel elle se trouve.The context type specifies the fully qualified context class name and the assembly it's in, and the databaseinitializer type specifies the fully qualified name of the initializer class and the assembly it's in. (Lorsque vous ne voulez pas que EF utilise l’initialiseur, vous pouvez définir un attribut sur l’élément context : disableDatabaseInitialization="true".) Pour plus d’informations, consultez paramètres du fichier de configuration.(When you don't want EF to use the initializer, you can set an attribute on the context element: disableDatabaseInitialization="true".) For more information, see Configuration File Settings.

    Une alternative à la définition de l’initialiseur dans le fichier Web. config consiste à le faire dans le code en ajoutant une instruction Database.SetInitializer à la méthode Application_Start dans le fichier global.asax.cs .An alternative to setting the initializer in the Web.config file is to do it in code by adding a Database.SetInitializer statement to the Application_Start method in the Global.asax.cs file. Pour plus d’informations, consultez fonctionnement des initialiseurs de base de données dans Entity Framework code First.For more information, see Understanding Database Initializers in Entity Framework Code First.

L’application est maintenant configurée de telle sorte que lorsque vous accédez à la base de données pour la première fois dans une exécution donnée de l’application, Entity Framework compare la base de données au modèle (vos classes SchoolContext et d’entité).The application is now set up so that when you access the database for the first time in a given run of the application, Entity Framework compares the database to the model (your SchoolContext and entity classes). En cas de différence, l’application supprime et recrée la base de données.If there's a difference, the application drops and re-creates the database.

Note

Lorsque vous déployez une application sur un serveur Web de production, vous devez supprimer ou désactiver le code qui supprime et recrée la base de données.When you deploy an application to a production web server, you must remove or disable code that drops and re-creates the database. Vous le ferez dans un didacticiel ultérieur de cette série.You'll do that in a later tutorial in this series.

Configurer EF 6 pour utiliser la base de données localeSet up EF 6 to use LocalDB

La base de données locale est une version allégée du moteur de base de données SQL Server Express.LocalDB is a lightweight version of the SQL Server Express database engine. Il est facile à installer et à configurer, démarre à la demande et s’exécute en mode utilisateur.It's easy to install and configure, starts on demand, and runs in user mode. La base de données locale s’exécute dans un 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 .LocalDB runs in a special execution mode of SQL Server Express that enables you to work with databases as .mdf files. Vous pouvez placer des fichiers de base de données de base de données locale dans le dossier application_Data d’un projet Web si vous souhaitez pouvoir copier la base de données avec le projet.You can put LocalDB database files in the App_Data folder of a web project if you want to be able to copy the database with the project. La fonctionnalité d’instance utilisateur de SQL Server Express vous permet également d’utiliser des fichiers . mdf , mais la fonctionnalité d’instance utilisateur est déconseillée. par conséquent, la base de données locale est recommandée pour travailler avec des fichiers . mdf .The user instance feature in SQL Server Express also enables you to work with .mdf files, but the user instance feature is deprecated; therefore, LocalDB is recommended for working with .mdf files. La base de données locale est installée par défaut dans Visual Studio.LocalDB is installed by default with Visual Studio.

En règle générale, SQL Server Express n’est pas utilisé pour les applications Web de production.Typically, SQL Server Express is not used for production web applications. En particulier, la base de données locale n’est pas recommandée pour une utilisation en production avec une application Web, car elle n’est pas conçue pour fonctionner avec IIS.LocalDB in particular is not recommended for production use with a web application because it's not designed to work with IIS.

  • Dans ce didacticiel, vous allez utiliser la base de données locale.In this tutorial, you'll work with LocalDB. Ouvrez le fichier Web. config de l’application et ajoutez un connectionStrings élément qui précède l’élément appSettings, comme indiqué dans l’exemple suivant.Open the application Web.config file and add a connectionStrings element preceding the appSettings element, as shown in the following example. (Veillez à mettre à jour le fichier Web. config dans le dossier racine du projet.(Make sure you update the Web.config file in the root project folder. Il y a également un fichier Web. config dans le sous-dossier views que vous n’avez pas besoin de mettre à jour.)There's also a Web.config file in the Views subfolder that you don't need to update.)

    <connectionStrings>
        <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    

La chaîne de connexion que vous avez ajoutée spécifie que Entity Framework utilise une base de données de base de données locale nommée ContosoUniversity1. mdf.The connection string you've added specifies that Entity Framework will use a LocalDB database named ContosoUniversity1.mdf. (La base de données n’existe pas encore, mais EF la crée.) Si vous souhaitez créer la base de données dans votre application_dossier Data , vous pouvez ajouter AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf à la chaîne de connexion.(The database doesn't exist yet but EF will create it.) If you want to create the database in your App_Data folder, you could add AttachDBFilename=|DataDirectory|\ContosoUniversity1.mdf to the connection string. Pour plus d’informations sur les chaînes de connexion, consultez SQL Server des chaînes de connexion pour les applications Web ASP.net.For more information about connection strings, see SQL Server Connection Strings for ASP.NET Web Applications.

Vous n’avez pas besoin d’une chaîne de connexion dans le fichier Web. config .You don't actually need a connection string in the Web.config file. Si vous ne fournissez pas de chaîne de connexion, Entity Framework utilise une chaîne de connexion par défaut basée sur votre classe de contexte.If you don't supply a connection string, Entity Framework uses a default connection string based on your context class. Pour plus d’informations, consultez Code First à une nouvelle base de données.For more information, see Code First to a New Database.

Créer un contrôleur et des vuesCreate controller and views

Vous allez maintenant créer une page Web pour afficher les données.Now you'll create a web page to display data. Le processus de demande des données déclenche automatiquement la création de la base de données.The process of requesting the data automatically triggers the creation of the database. Vous commencerez par créer un nouveau contrôleur.You'll begin by creating a new controller. Mais avant cela, générez le projet pour rendre les classes de modèle et de contexte disponibles pour la génération de modèles automatique de contrôleur MVC.But before you do that, build the project to make the model and context classes available to MVC controller scaffolding.

  1. Cliquez avec le bouton droit sur le dossier Controllers dans Explorateur de solutions, sélectionnez Ajouter, puis cliquez sur nouvel élémentgénéré automatiquement.Right-click the Controllers folder in Solution Explorer, select Add, and then click New Scaffolded Item.

  2. Dans la boîte de dialogue Ajouter une structure , sélectionnez contrôleur MVC 5 avec affichages, à l’aide de Entity Framework, puis choisissez Ajouter.In the Add Scaffold dialog box, select MVC 5 Controller with views, using Entity Framework, and then choose Add.

    Boîte de dialogue Ajouter une structure dans Visual Studio

  3. Dans la boîte de dialogue Ajouter un contrôleur , effectuez les sélections suivantes, puis choisissez Ajouter:In the Add Controller dialog box, make the following selections, and then choose Add:

    • Classe de modèle : Student (ContosoUniversity. Models) .Model class: Student (ContosoUniversity.Models). (Si vous ne voyez pas cette option dans la liste déroulante, générez le projet et réessayez.)(If you don't see this option in the drop-down list, build the project and try again.)

    • Classe de contexte de données : SchoolContext (ContosoUniversity. dal) .Data context class: SchoolContext (ContosoUniversity.DAL).

    • Nom du contrôleur : StudentController (et non StudentsController).Controller name: StudentController (not StudentsController).

    • Laissez les valeurs par défaut pour les autres champs.Leave the default values for the other fields.

      Lorsque vous cliquez sur Ajouter, le générateur de modèles crée un fichier StudentController.cs et un ensemble de vues (fichiers . cshtml ) qui fonctionnent avec le contrôleur.When you click Add, the scaffolder creates a StudentController.cs file and a set of views (.cshtml files) that work with the controller. À l’avenir, lorsque vous créerez des projets qui utilisent Entity Framework, vous pouvez également tirer parti de certaines fonctionnalités supplémentaires de l’échafaudage : créer votre première classe de modèle, ne pas créer de chaîne de connexion, puis, dans la zone Ajouter un contrôleur , spécifier un nouveau contexte de données en sélectionnant le bouton + en regard de classe de contexte de données.In the future when you create projects that use Entity Framework, you can also take advantage of some additional functionality of the scaffolder: create your first model class, don't create a connection string, and then in the Add Controller box specify New data context by selecting the + button next to Data context class. L’échafaudage crée votre classe DbContext et votre chaîne de connexion, ainsi que le contrôleur et les vues.The scaffolder will create your DbContext class and your connection string as well as the controller and views.

  4. Visual Studio ouvre le fichier Controllers\StudentController.cs .Visual Studio opens the Controllers\StudentController.cs file. Vous voyez qu’une variable de classe a été créée pour instancier un objet de contexte de base de données :You see that a class variable has been created that instantiates a database context object:

    private SchoolContext db = new SchoolContext();
    

    La méthode d’action Index obtient une liste des étudiants du jeu d’entités students en lisant la propriété Students de l’instance de contexte de base de données :The Index action method gets a list of students from the Students entity set by reading the Students property of the database context instance:

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

    La vue Student\Index.cshtml affiche cette liste dans une table :The Student\Index.cshtml view displays this list in a table:

    <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.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    
  5. Appuyez sur Ctrl+F5 pour exécuter le projet.Press Ctrl+F5 to run the project. (Si vous recevez l’erreur « Impossible de créer un cliché instantané », fermez le navigateur, puis réessayez.)(If you get a "Cannot create Shadow Copy" error, close the browser and try again.)

    Cliquez sur l’onglet students pour afficher les données de test insérées par la méthode Seed.Click the Students tab to see the test data that the Seed method inserted. En fonction de la précision de la fenêtre de votre navigateur, vous verrez le lien de l’onglet Student dans la barre d’adresse principale ou vous devrez cliquer sur le coin supérieur droit pour afficher le lien.Depending on how narrow your browser window is, you'll see the Student tab link in the top address bar or you'll have to click the upper right corner to see the link.

    Bouton Menu

Afficher la base de donnéesView the database

Lorsque vous avez exécuté la page Students et que l’application a tenté d’accéder à la base de données, EF a découvert qu’il n’existait aucune base de données et n’en a créé une.When you ran the Students page and the application tried to access the database, EF discovered that there was no database and created one. EF a ensuite exécuté la méthode Seed pour remplir la base de données avec des données.EF then ran the seed method to populate the database with data.

Vous pouvez utiliser Explorateur de serveurs ou Explorateur d’objets SQL Server (SSOX) pour afficher la base de données dans Visual Studio.You can use either Server Explorer or SQL Server Object Explorer (SSOX) to view the database in Visual Studio. Pour ce didacticiel, vous allez utiliser Explorateur de serveurs.For this tutorial, you'll use Server Explorer.

  1. Fermez le navigateur.Close the browser.

  2. Dans Explorateur de serveurs, développez connexions de données (vous devrez peut-être sélectionner d’abord le bouton Actualiser), développer le contexte School (ContosoUniversity) , puis développer les tables pour afficher les tables dans votre nouvelle base de données.In Server Explorer, expand Data Connections (you may need to select the refresh button first), expand School Context (ContosoUniversity), and then expand Tables to see the tables in your new database.

  3. Cliquez avec le bouton droit sur la table Student et cliquez sur afficher les données de la table pour afficher les colonnes qui ont été créées et les lignes qui ont été insérées dans la table.Right-click the Student table and click Show Table Data to see the columns that were created and the rows that were inserted into the table.

  4. Fermez la connexion Explorateur de serveurs .Close the Server Explorer connection.

Les fichiers de base de données ContosoUniversity1. mdf et . ldf se trouvent dans le dossier % UserProfile% .The ContosoUniversity1.mdf and .ldf database files are in the %USERPROFILE% folder.

Étant donné que vous utilisez l’initialiseur DropCreateDatabaseIfModelChanges, vous pouvez maintenant apporter une modification à la classe Student, réexécuter l’application et la base de données sera automatiquement recréée pour correspondre à votre modification.Because you're using the DropCreateDatabaseIfModelChanges initializer, you could now make a change to the Student class, run the application again, and the database would automatically be re-created to match your change. Par exemple, si vous ajoutez une propriété EmailAddress à la classe Student, réexécutez la page Students, puis examinez à nouveau la table, vous verrez une nouvelle colonne EmailAddress.For example, if you add an EmailAddress property to the Student class, run the Students page again, and then look at the table again, you'll see a new EmailAddress column.

ConventionsConventions

La quantité de code que vous devez écrire pour Entity Framework être en mesure de créer une base de données complète pour vous est minime en raison de conventionsou d’hypothèses que Entity Framework effectue.The amount of code you had to write in order for Entity Framework to be able to create a complete database for you is minimal because of conventions, or assumptions that Entity Framework makes. Certains d’entre eux ont déjà été notés ou ont été utilisés sans que vous en soyez conscient :Some of them have already been noted or were used without your being aware of them:

  • Les formes plusieurs des noms de classes d’entité sont utilisées comme noms de tables.The pluralized forms of entity class names are used as table names.
  • Les noms des propriétés d’entités sont utilisés comme noms de colonnes.Entity property names are used for column names.
  • Les propriétés d’entité nommées ID ou classname ID sont reconnues en tant que propriétés de clé primaire.Entity properties that are named ID or classname ID are recognized as primary key properties.
  • Une propriété est interprétée comme une propriété de clé étrangère si elle est nommée <nom de la propriété de navigation><nom de la propriété de clé primaire> (par exemple, StudentID pour la propriété de navigation Student, car la clé primaire de l’entité Student est ID).A property is interpreted as a foreign key property if it's named <navigation property name><primary key property name> (for example, StudentID for the Student navigation property since the Student entity's primary key is ID). Les propriétés de clé étrangère peuvent également être nommées de la même façon <nom de propriété de clé primaire> (par exemple, EnrollmentID depuis la EnrollmentIDde la clé primaire de l’entité Enrollment).Foreign key properties can also be named the same simply <primary key property name> (for example, EnrollmentID since the Enrollment entity's primary key is EnrollmentID).

Vous avez vu que les conventions peuvent être remplacées.You've seen that conventions can be overridden. Par exemple, vous avez spécifié que les noms de tables ne doivent pas être plurielés, et vous verrez plus tard comment marquer explicitement une propriété en tant que propriété de clé étrangère.For example, you specified that table names shouldn't be pluralized, and you'll see later how to explicitly mark a property as a foreign key property.

Obtenir le codeGet the code

Télécharger le projet terminéDownload Completed Project

Ressources supplémentairesAdditional resources

Pour plus d’informations sur EF 6, consultez les articles suivants :For more about EF 6, see these articles:

Étapes suivantesNext steps

Dans ce didacticiel, vous avez effectué les actions suivantes :In this tutorial, you:

  • Création d’une application Web MVCCreated an MVC web app
  • Définir le style de siteSet up the site style
  • Installé le Entity Framework 6Installed Entity Framework 6
  • Créer le modèle de donnéesCreated the data model
  • Créer le contexte de base de donnéesCreated the database context
  • Initialiser la base de données avec des données de testInitialized DB with test data
  • Configurer EF 6 pour utiliser la base de données localeSet up EF 6 to use LocalDB
  • Créer un contrôleur et des vuesCreated controller and views
  • Afficher la base de donnéesViewed the database

Passez à l’article suivant pour découvrir comment examiner et personnaliser le code de création, lecture, mise à jour, suppression (CRUD) dans vos contrôleurs et vues.Advance to the next article to learn how to review and customize the create, read, update, delete (CRUD) code in your controllers and views.