Tutoriel : Utiliser EF Migrations dans une application ASP.NET MVC et déployer sur Azure
Jusqu’à présent, l’exemple d’application web Contoso University s’exécute localement dans IIS Express sur votre ordinateur de développement. Pour rendre une application réelle disponible pour d’autres personnes à utiliser sur Internet, vous devez la déployer sur un fournisseur d’hébergement web. Dans ce tutoriel, vous allez activer les migrations Code First et déployer l’application dans le cloud dans Azure :
- Activez Migrations Code First. La fonctionnalité Migrations vous permet de modifier le modèle de données et de déployer vos modifications en production en mettant à jour le schéma de base de données sans avoir à supprimer et recréer la base de données.
- Déployer dans Azure Cette étape est facultative ; vous pouvez poursuivre les didacticiels restants sans avoir déployé le projet.
Nous vous recommandons d’utiliser un processus d’intégration continue avec le contrôle de code source pour le déploiement, mais ce didacticiel ne traite pas de ces rubriques. Pour plus d’informations, consultez les chapitres de contrôle de code source et d’intégration continue de Building Real-World Cloud Apps avec Azure.
Dans ce tutoriel, vous allez :
- Activer les migrations Code First
- Déployer l’application dans Azure (facultatif)
Prérequis
Activer les migrations Code First
Quand vous développez une nouvelle application, votre modèle de données change fréquemment et, chaque fois que le modèle change, il n’est plus en synchronisation avec la base de données. Vous avez configuré Entity Framework pour supprimer et recréer automatiquement la base de données chaque fois que vous modifiez le modèle de données. Lorsque vous ajoutez, supprimez ou modifiez des classes d’entité ou modifiez votre DbContext
classe, la prochaine fois que vous exécutez l’application, elle supprime automatiquement votre base de données existante, crée une nouvelle base de données qui correspond au modèle et la crée avec des données de test.
Cette méthode pour conserver la base de données en synchronisation avec le modèle de données fonctionne bien jusqu’au déploiement de l’application en production. Lorsque l’application s’exécute en production, elle stocke généralement les données que vous souhaitez conserver, et vous ne souhaitez pas perdre tout chaque fois que vous apportez une modification telle que l’ajout d’une nouvelle colonne. La fonctionnalité Migrations Code First résout ce problème en permettant à Code First de mettre à jour le schéma de base de données au lieu de supprimer et de recréer la base de données. Dans ce tutoriel, vous allez déployer l’application et vous préparerez pour cela que vous allez activer les migrations.
Désactivez l’initialiseur que vous avez configuré précédemment en commentant ou en supprimant l’élément
contexts
que vous avez ajouté au fichier Web.config de l’application.<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>
Dans le fichier Web.config de l’application, remplacez le nom de la base de données dans le chaîne de connexion par ContosoUniversity2.
<connectionStrings> <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings>
Cette modification configure le projet afin que la première migration crée une base de données. Cela n’est pas obligatoire, mais vous verrez plus tard pourquoi c’est une bonne idée.
Dans le menu Outils, sélectionnez Gestionnaire de package NuGet>Console du gestionnaire de package.
À l’invite
PM>
, entrez les commandes suivantes :enable-migrations add-migration InitialCreate
La
enable-migrations
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.(Si vous avez manqué l’étape ci-dessus qui vous dirige vers la modification du nom de la base de données, Migrations trouve la base de données existante et effectue automatiquement la
add-migration
commande. C’est correct, cela signifie simplement que vous n’exécuterez pas de test du code des migrations avant de déployer la base de données. Plus tard, lorsque vous exécutez laupdate-database
commande, rien ne se produit, car la base de données existe déjà.)Ouvrez le fichier ContosoUniversity\Migrations\Configuration.cs . Comme la classe d’initialiseur que vous avez vue précédemment, la
Configuration
classe inclut uneSeed
méthode.internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext> { public Configuration() { AutomaticMigrationsEnabled = false; } protected override void Seed(ContosoUniversity.DAL.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 la méthode Seed est de vous permettre d’insérer ou de mettre à jour des données de test après la création ou la mise à jour de la base de données. La méthode est appelée lorsque la base de données est créée et chaque fois que le schéma de base de données est mis à jour après une modification d’un modèle de données.
Configurer la méthode Seed
Lorsque vous supprimez et recréez la base de données pour chaque modification de modèle de données, vous utilisez la méthode de Seed
la classe initialiseur pour insérer des données de test, car après chaque modification de modèle, la base de données est supprimée et toutes les données de test sont perdues. 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 insère dans la base de données uniquement les données dont vous avez besoin 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.
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 ContosoUniversity.Models; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; 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").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, Grade = Grade.C }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID }, new Enrollment { StudentID = students.Single(s => s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Barzdukas").ID, CourseID = courses.Single(c => c.Title == "Chemistry").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Li").ID, CourseID = courses.Single(c => c.Title == "Composition").CourseID, Grade = Grade.B }, new Enrollment { StudentID = students.Single(s => s.LastName == "Justice").ID, CourseID = courses.Single(c => c.Title == "Literature").CourseID, Grade = Grade.B } }; foreach (Enrollment e in enrollments) { var enrollmentInDataBase = context.Enrollments.Where( s => s.Student.ID == 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 chaque fois que vous exécutez laupdate-database
commande, généralement après 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 façon de 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. 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 crée
Enrollment
des entités suppose que vous avez laID
valeur dans les entités de lastudents
collection, bien que vous n’ayez pas défini cette propriété dans le code qui crée la collection.new Enrollment { StudentID = students.Single(s => s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A },
Vous pouvez utiliser la
ID
propriété ici, car laID
valeur est définie lorsque vous appelezSaveChanges
lastudents
collection. EF obtient automatiquement la valeur de clé primaire lorsqu’elle insère une entité dans la base de données et met à jour laID
propriété de l’entité en mémoire.Le code qui ajoute chaque
Enrollment
entité auEnrollments
jeu d’entités n’utilise pas laAddOrUpdate
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 note d’inscription à l’aide de l’interface utilisateur de l’application. Le code effectue une boucle dans chaque membre de laEnrollment
liste 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.ID == e.Student.ID && s.Course.CourseID == e.Course.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) { context.Enrollments.Add(e); } }
Créez le projet.
Exécuter la première migration
Lorsque vous avez exécuté la add-migration
commande, migrations a généré le code qui créerait la base de données à partir de zéro. Ce code se trouve également dans le dossier Migrations, dans le fichier nommé <timestamp>_InitialCreate.cs. 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.
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Course",
c => new
{
CourseID = c.Int(nullable: false),
Title = c.String(),
Credits = c.Int(nullable: false),
})
.PrimaryKey(t => t.CourseID);
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.Student",
c => new
{
ID = c.Int(nullable: false, identity: true),
LastName = c.String(),
FirstMidName = c.String(),
EnrollmentDate = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.ID);
}
public override void Down()
{
DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student");
DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course");
DropIndex("dbo.Enrollment", new[] { "StudentID" });
DropIndex("dbo.Enrollment", new[] { "CourseID" });
DropTable("dbo.Student");
DropTable("dbo.Enrollment");
DropTable("dbo.Course");
}
}
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
.
Il s’agit de la migration initiale qui a été créée lorsque vous avez entré la add-migration InitialCreate
commande. Le paramètre (InitialCreate
dans l’exemple) 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 ».
Si vous avez créé la migration initiale alors que la base de données existait déjà, le code de création de la base de données est généré, mais il n’est pas nécessaire de l’exécuter, car la base de données correspond déjà au modèle de données. Quand vous déployez l’application sur un autre environnement où la base de données n’existe pas encore, ce code est exécuté pour créer votre base de données : il est donc judicieux de le tester au préalable. C’est pourquoi vous avez modifié le nom de la base de données dans le chaîne de connexion précédemment, afin que les migrations puissent en créer une nouvelle à partir de zéro.
Dans la fenêtre Console du Gestionnaire de package , entrez la commande suivante :
update-database
La
update-database
commande exécute laUp
méthode pour créer la base de données, puis elle exécute laSeed
méthode pour remplir la base de données. Le même processus s’exécute automatiquement en production après avoir déployé l’application, comme vous le verrez dans la section suivante.Utilisez l’Explorateur de serveurs pour inspecter la base de données comme vous l’avez fait dans le premier tutoriel, puis exécutez l’application pour vérifier que tout fonctionne toujours de la même façon qu’auparavant.
Déployer dans Azure
Jusqu’à présent, l’application s’exécute localement dans IIS Express sur votre ordinateur de développement. Pour le rendre disponible pour d’autres personnes à utiliser sur Internet, vous devez le déployer sur un fournisseur d’hébergement web. Dans cette section du tutoriel, vous allez le déployer sur Azure. Cette section est facultative ; vous pouvez ignorer cela et continuer avec le tutoriel suivant, ou vous pouvez adapter les instructions de cette section pour un autre fournisseur d’hébergement de votre choix.
Utiliser les migrations Code First pour déployer la base de données
Pour déployer la base de données, vous allez utiliser Migrations Code First. Lorsque vous créez le profil de publication que vous utilisez pour configurer les paramètres de déploiement à partir de Visual Studio, vous activez une case à cocher intitulée Update Database. Ce paramètre entraîne la configuration automatique du fichier Web.config de l’application sur le serveur de destination afin que Code First utilise la MigrateDatabaseToLatestVersion
classe initialiseur.
Visual Studio ne fait rien avec la base de données pendant le processus de déploiement pendant la copie de votre projet sur le serveur de destination. Lorsque vous exécutez l’application déployée et qu’elle accède à la base de données pour la première fois après le déploiement, Code First vérifie si la base de données correspond au modèle de données. S’il existe une incompatibilité, Code First crée automatiquement la base de données (s’il n’existe pas encore) ou met à jour le schéma de base de données vers la dernière version (si une base de données existe mais ne correspond pas au modèle). Si l’application implémente une méthode Migrations Seed
, la méthode s’exécute après la création de la base de données ou le schéma est mis à jour.
Votre méthode Migrations Seed
insère des données de test. Si vous déployiez dans un environnement de production, vous devrez modifier la Seed
méthode afin qu’elle insère uniquement des données que vous souhaitez insérer dans votre base de données de production. Par exemple, dans votre modèle de données actuel, vous souhaiterez peut-être avoir des cours réels, mais des étudiants fictifs dans la base de données de développement. Vous pouvez écrire une Seed
méthode pour charger à la fois dans le développement, puis commenter les étudiants fictifs avant de déployer en production. Vous pouvez également écrire une Seed
méthode pour charger uniquement des cours et entrer manuellement les étudiants fictifs dans la base de données de test à l’aide de l’interface utilisateur de l’application.
Obtenir un compte Azure
Vous aurez besoin d’un compte Azure. Si vous n’en avez pas encore, mais que vous disposez d’un abonnement Visual Studio, vous pouvez activer vos avantages d’abonnement. Sinon, vous pouvez créer un compte d’essai gratuit en quelques minutes. Pour plus d’informations, consultez Essai gratuit Azure.
Créer un site web et une base de données SQL dans Azure
Votre application web dans Azure s’exécute dans un environnement d’hébergement partagé, ce qui signifie qu’elle s’exécute sur des machines virtuelles partagées avec d’autres clients Azure. Un environnement d'hébergement partagé permet de commencer à utiliser le cloud à moindre frais. Plus tard, si votre trafic Web augmente, vous pourrez mettre votre application à l'échelle pour répondre à vos besoins, en exécutant des machines virtuelles dédiées. Pour en savoir plus sur les options de tarification pour Azure App Service, consultez la tarification d’App Service.
Vous allez déployer la base de données sur Azure SQL Database. SQL Database est un service de base de données relationnelle basé sur le cloud basé sur des technologies SQL Server. Outils et applications qui fonctionnent avec SQL Server fonctionnent également avec une base de données SQL.
Dans le portail de gestion Azure, choisissez Créer une ressource sous l’onglet gauche, puis sélectionnez Afficher tout dans le volet Nouveau (ou panneau) pour afficher toutes les ressources disponibles. Choisissez Web App + SQL dans la section Web du panneau Tout . Enfin, choisissez Créer.
Le formulaire permettant de créer une ressource New Web App + SQL s’ouvre.
Entrez une chaîne dans la zone Nom de l’application à utiliser comme URL unique pour votre application. L’URL complète se compose de ce que vous entrez ici plus le domaine par défaut d’Azure App Services (.azurewebsites.net). Si le nom de l’application est déjà pris, l’Assistant vous avertit d’un message rouge. Le nom de l’application n’est pas disponible. Si le nom de l’application est disponible, vous voyez une coche verte.
Dans la zone Abonnement , choisissez l’abonnement Azure dans lequel vous souhaitez que App Service réside.
Dans la zone de texte Groupe de ressources, choisissez un groupe de ressources ou créez-en un. Ce paramètre spécifie le centre de données dans lequel votre site web s’exécutera. Pour plus d’informations sur les groupes de ressources, consultez Groupes de ressources.
Créez un plan App Service en cliquant sur la section App Service, Créer et renseignez le plan App Service (peut être le même nom que App Service), l’emplacement et le niveau tarifaire (il existe une option gratuite).
Cliquez sur SQL Database, puis choisissez Créer une base de données ou sélectionnez une base de données existante.
Dans la zone Nom , entrez un nom pour votre base de données.
Cliquez sur la zone Serveur cible, puis sélectionnez Créer un serveur. Sinon, si vous avez créé un serveur précédemment, vous pouvez sélectionner ce serveur dans la liste des serveurs disponibles.
Choisissez la section Niveau tarifaire, choisissez Gratuit. Si des ressources supplémentaires sont nécessaires, la base de données peut être mise à l’échelle à tout moment. Pour en savoir plus sur la tarification Azure SQL, consultez la tarification d’Azure SQL Database.
Modifiez le classement en fonction des besoins.
Entrez un nom d’utilisateur administrateur SQL Admin et un mot de passe d’administrateur SQL.
- Si vous avez sélectionné Nouveau serveur SQL Database, définissez un nouveau nom et un nouveau mot de passe que vous utiliserez ultérieurement lorsque vous accédez à la base de données.
- Si vous avez sélectionné un serveur que vous avez créé précédemment, entrez les informations d’identification de ce serveur.
La collecte de données de télémétrie peut être activée pour App Service à l’aide d’Application Insights. Avec peu de configuration, Application Insights collecte des informations d’événement, d’exception, de dépendance, de requête et de trace précieuses. Pour en savoir plus sur Application Insights, consultez Azure Monitor.
Cliquez sur Créer en bas pour indiquer que vous avez terminé.
Le portail de gestion retourne à la page Tableau de bord et la zone Notifications en haut de la page indique que le site est en cours de création. Après un certain temps (généralement moins d’une minute), il existe une notification indiquant que le déploiement a réussi. Dans la barre de navigation à gauche, le nouvel App Service apparaît dans la section App Services et la nouvelle base de données SQL apparaît dans la section Bases de données SQL.
Déploiement de l’application dans Azure
Dans l’Explorateur de solutions de Visual Studio, cliquez avec le bouton droit sur le projet, puis dans le menu contextuel, sélectionnez Publier.
Dans la page Choisir une cible de publication, choisissez App Service, puis Sélectionnez Existant, puis Publiez.
Si vous n’avez pas précédemment ajouté votre abonnement Azure dans Visual Studio, effectuez les étapes à l’écran. Ces étapes permettent à Visual Studio de se connecter à votre abonnement Azure afin que la liste d’App Services inclue votre site web.
Dans la page App Service, sélectionnez l’abonnement auquel vous avez ajouté App Service. Sous Affichage, sélectionnez Groupe de ressources. Développez le groupe de ressources auquel vous avez ajouté App Service, puis sélectionnez App Service. Choisissez OK pour publier l’application.
La fenêtre Output indique les actions de déploiement entreprises et signale la réussite du déploiement.
Une fois le déploiement réussi, le navigateur par défaut s’ouvre automatiquement à l’URL du site web déployé.
Votre application s’exécute maintenant dans le cloud.
À ce stade, la base de données SchoolContext a été créée dans la base de données Azure SQL, car vous avez sélectionné Exécuter Migrations Code First (s’exécute au démarrage de l’application). Le fichier Web.config du site web déployé a été modifié afin que l’initialiseur MigrateDatabaseToLatestVersion exécute la première fois que votre code lit ou écrit des données dans la base de données (qui se sont produites lorsque vous avez sélectionné l’onglet Étudiants ) :
Le processus de déploiement a également créé une nouvelle chaîne de connexion (SchoolContext_DatabasePublish) pour Migrations Code First à utiliser pour mettre à jour le schéma de base de données et amorçage de la base de données.
Vous trouverez la version déployée du fichier Web.config sur votre propre ordinateur dans ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Vous pouvez accéder au fichier Web.config déployé lui-même à l’aide du protocole FTP. Pour obtenir des instructions, consultez ASP.NET Déploiement web à l’aide de Visual Studio : Déploiement d’une mise à jour de code. Suivez les instructions qui commencent par « Pour utiliser un outil FTP, vous avez besoin de trois éléments : l’URL FTP, le nom d’utilisateur et le mot de passe ».
Remarque
L’application web n’implémente pas la sécurité. Par conséquent, toute personne qui trouve l’URL peut modifier les données. Pour obtenir des instructions sur la sécurisation du site web, consultez Déployer une application MVC sécurisée ASP.NET avec l’appartenance, OAuth et la base de données SQL sur Azure. Vous pouvez empêcher d’autres personnes d’utiliser le site en arrêtant le service à l’aide du portail de gestion Azure ou de l’Explorateur de serveurs dans Visual Studio.
Scénarios de migrations avancées
Si vous déployez une base de données en exécutant automatiquement des migrations comme indiqué dans ce didacticiel et que vous effectuez un déploiement sur un site web qui s’exécute sur plusieurs serveurs, vous pouvez obtenir plusieurs serveurs qui essaient d’exécuter des migrations en même temps. Les migrations sont atomiques. Par conséquent, si deux serveurs essaient d’exécuter la même migration, l’un réussit et l’autre échoue (en supposant que les opérations ne peuvent pas être effectuées deux fois). Dans ce scénario, si vous souhaitez éviter ces problèmes, vous pouvez appeler des migrations manuellement et configurer votre propre code afin qu’il ne se produise qu’une seule fois. Pour plus d’informations, consultez Exécution et script de migrations à partir du blog de Rowan Miller et Migrate.exe (pour l’exécution de migrations à partir de la ligne de commande).
Pour plus d’informations sur d’autres scénarios de migration, consultez Migrations Screencast Series.
Mettre à jour une migration spécifique
update-database -target MigrationName
La update-database -target MigrationName
commande exécute la migration ciblée.
Ignorer les modifications de migration vers la base de données
Add-migration MigrationName -ignoreChanges
ignoreChanges
crée une migration vide avec le modèle actuel en tant qu’instantané.
Initialiseurs de code First
Dans la section déploiement, vous avez vu l’initialiseur MigrateDatabaseToLatestVersion utilisé. Code First fournit également d’autres initialiseurs, notamment CreateDatabaseIfNotExists (valeur par défaut), DropCreateDatabaseIfModelChanges (que vous avez utilisé précédemment) et DropCreateDatabaseAlways. L’initialiseur DropCreateAlways
peut être utile pour configurer des conditions pour les tests unitaires. Vous pouvez également écrire vos propres initialiseurs, et vous pouvez appeler un initialiseur explicitement si vous ne souhaitez pas attendre que l’application lise ou écrit dans la base de données.
Pour plus d’informations sur les initialiseurs, consultez Présentation des initialiseurs de base de données dans Entity Framework Code First et le chapitre 6 du livre Programming Entity Framework : Code First de Julie Lerman et Rowan Miller.
Obtenir le code
Ressources supplémentaires
Vous trouverez des liens vers d’autres ressources Entity Framework dans ASP.NET Accès aux données - Ressources recommandées.
Étapes suivantes
Dans ce tutoriel, vous allez :
- Migrations Code First activées
- Déploiement de l’application dans Azure (facultatif)
Passez à l’article suivant pour découvrir comment créer un modèle de données plus complexe pour une application MVC ASP.NET.