Développement d’application avec base de données Semaine 9 : Code First avec Entité Framework Automne 2015 Tous le matériel provient de :
Introduction
Code First pour une nouvelle base de données Annotations de données Migrations Code First Définir les propriétés DbSet Plan de présentation
Ce scénario inclut le ciblage d'une base de données qui n'existe pas et qui sera créée par Code First, ou d'une base de données vide à laquelle Code First ajoutera de nouvelles tables. Code First vous permet de définir votre modèle à l'aide de classes C# ou VB.Net. Une configuration supplémentaire peut éventuellement être effectuée à l'aide d'attributs sur vos classes et propriétés ou en utilisant une API Fluent. Code First pour une nouvelle base de données
Pour l’instant, nous allons créer un ADO.NET Entity Data Model avec un Modèle Vide Code First. Par défaut, la base de données sera local. Nous pourrions modifier la chaîne de connexion de l’App.config…mais hors de question que vous donnes accès à mon serveur en Code First Si vous voulez utiliser code First à partir d’une base de données existante, vous n’avez qu’à sélectionner la dernière option. Code First pour une nouvelle base de données
Ensuite, nous allons ajouter des classes pour les entités suivantes : Code First pour une nouvelle base de données
Maintenant il est temps de définir un contexte dérivé, qui représente une session de base de données, permettant d'interroger et d'enregistrer des données. Vous définissez un contexte qui dérive de System.Data.Entity.DbContext et expose un DbSet typé pour chaque classe dans le modèle. Code First pour une nouvelle base de données *On aurait pu définir seulement une propriété set.
Lire et écrire des données Code First pour une nouvelle base de données
Où sont mes données ? Par convention DbContext a créé une base de données pour vous. Si une instance SQL Express locale est disponible, Code First a créé la base de données sur cette instance. Si SQL Express n'est pas disponible, Code First utilise la base de données LocalDbLocalDb La base de données est nommée d'après le nom complet du contexte dérivé, dans ce cas CodeFirstNewDatabaseSample.BloggingContext Il s'agit uniquement des conventions utilisées par défaut et il existe différentes méthodes pour modifier la base de données utilisée par Code First. Code First pour une nouvelle base de données
Traitement des modifications de modèle Le code généré automatiquement indique que vous devez ajouter une colonne Url, qui contient les données de chaîne, à la table dbo.Blogs. Le cas échéant, modifiez le code généré automatiquement. Cela n'est pas nécessaire dans ce cas. namespace CodeFirstNewDatabaseSample.Migrations { using System; using System.Data.Entity.Migrations; public partial class AddUrl : DbMigration { public override void Up() { AddColumn("dbo.Blogs", "Url", c => c.String()); } public override void Down() { DropColumn("dbo.Blogs", "Url"); } } } Exécutez la commande Update-Database dans la console du gestionnaire de package. Cette commande applique les migrations en attente à la base de données. La migration InitialCreate a déjà été appliquée. Par conséquent, Migrations applique uniquement la nouvelle migration AddUrl. Code First pour une nouvelle base de données
Jusqu'à présent vous avez laissé Entity Framework détecter le modèle à l'aide des conventions utilisées par défaut. Cependant, il peut arriver que les classes ne respectent pas les conventions et vous devez être en mesure d'effectuer d'autres tâches de configuration. Il existe deux options à cet effet. Vous allez découvrir les annotations de données dans cette section et l'API Fluent dans la section suivante. Annotations de données
Clé Par convention on utilise ID dans le nom de la clé. Autrement, on utilise l’annotation [Key] Annotations de données
Obligatoire L'annotation Required indique à Entity Framework qu'une propriété spécifique est requise. Le fait d'ajouter Required à la propriété Title force Entity Framework (et MVC) à vérifier que la propriété contient des données. Annotations de données [Required] public string Title { get; set; } L'attribut Required affecte la base de données générée en transformant la propriété mappée en propriété non-nullable. Notez que le champ Titre est devenu « not null ».
NotMapped Une convention Code First stipule que chaque propriété qui est d'un type de données pris en charge doit être représentée dans la base de données. Mais ce n'est pas toujours le cas dans vos applications. Par exemple, vous pouvez disposer d'une propriété dans la classe Blog qui crée un code basé sur les champs Title et BloggerName. Annotations de données
ComplexType Il n'est pas rare de décrire vos entités de domaine sur un jeu de classes et de superposer ces classes pour décrire une entité complète. Par exemple, ajoutez une classe appelée BlogDetails à votre modèle et lié la à la classe Blog (public BlogDetails BlogDetail { get; set; }). Annotations de données
ComplexType Notez que BlogDetails n'a aucune propriété de type de clé. Annotations de données
DatabaseGenerated Une des fonctionnalités intéressante d'une base de données est la possibilité de disposer de propriétés calculées. Si vous mappez les classes Code First à des tables qui contiennent des colonnes calculées, vous ne souhaitez pas qu'Entity Framework mette à jour ces colonnes. Cependant, vous souhaitez qu'Entity Framework retourne ces valeurs de la base de données après que vous avez inséré ou mis à jour les données. Utilisez l'annotation DatabaseGenerated pour marquer ces propriétés dans la classe avec l'énumération Computed. None et Identity constituent d'autres enums. Annotations de données
InverseProperty et ForeignKey Il est possible de définir sur quel champs la clé étrangère sera utilisée. Annotations de données
NotMapped Une convention Code First stipule que chaque propriété qui est d'un type de données pris en charge doit être représentée dans la base de données. Mais ce n'est pas toujours le cas dans vos applications. Par exemple, vous pouvez disposer d'une propriété dans la classe Blog qui crée un code basé sur les champs Title et BloggerName. Annotations de données
NotMapped Une convention Code First stipule que chaque propriété qui est d'un type de données pris en charge doit être représentée dans la base de données. Mais ce n'est pas toujours le cas dans vos applications. Par exemple, vous pouvez disposer d'une propriété dans la classe Blog qui crée un code basé sur les champs Title et BloggerName. Annotations de données
NotMapped Une convention Code First stipule que chaque propriété qui est d'un type de données pris en charge doit être représentée dans la base de données. Mais ce n'est pas toujours le cas dans vos applications. Par exemple, vous pouvez disposer d'une propriété dans la classe Blog qui crée un code basé sur les champs Title et BloggerName. Annotations de données
NotMapped Une convention Code First stipule que chaque propriété qui est d'un type de données pris en charge doit être représentée dans la base de données. Mais ce n'est pas toujours le cas dans vos applications. Par exemple, vous pouvez disposer d'une propriété dans la classe Blog qui crée un code basé sur les champs Title et BloggerName. Annotations de données
Modifications de modèle Modifiez votre modèle, ajoutez une propriété Url à la classe Blog : public class Blog { public int BlogId { get; set; } public string Name { get; set; } public string Url { get; set; } public virtual List Posts { get; set; } } Si vous réexécutez l'application, vous obtenez une exception InvalidOperationException qui indique que le modèle de sauvegarde du contexte « BlogContext » a changé depuis la création de la base de données. Envisagez d'utiliser Migrations Code First pour mettre à jour la base de données ( Migrations Code First
Traitement des modifications de modèle La première étape consiste à activer Migrations Code First pour BloggingContext. Outils -> Gestionnaire de package de bibliothèque -> Console Gestionnaire de package Exécutez la commande Enable-Migrations dans la console du gestionnaire de package. Un dossier Migrations a été ajouté au projet, qui contient deux éléments : Configuration.cs – Ce fichier contient les paramètres qui seront utilisés par Migrations pour migrer BloggingContext. Aucune modification n'est nécessaire pour effectuer cette procédure pas à pas. Mais vous pouvez spécifier les données de départ, inscrire des fournisseurs pour d'autres bases de données, modifier l'espace de noms dans lequel les migrations sont générées, etc., dans ce fichier. _InitialCreate.cs – Il s'agit de la première migration. Elle représente les modifications qui ont déjà été appliquées à la base de données pour la faire passer d'une base de données vide à une base de données qui inclut les tables Blogs et Posts. Bien que vous ayez laissé Code First créer automatiquement ces tables, maintenant que vous avez opté pour Migrations, elles ont été converties en une migration. Code First a également enregistré dans la base de données locale que cette Migration a déjà été appliquée. L'horodateur sur le nom de fichier est utilisé à des fins de tri. Migrations Code First
Traitement des modifications de modèle Migrations Code First dispose de deux commandes principales avec lesquelles vous allez vous familiariser. Add-Migration génère un modèle automatique de la migration suivante en fonction des modifications apportées à votre modèle depuis la création de la dernière migration. Update-Database applique les migrations en attente à la base de données. Vous devez générer un modèle automatique de migration pour prendre soin de la nouvelle propriété URL que vous avez ajoutée. La commande Add-Migrationvous permet de donner un nom à ces migrations. Appelez les vôtres AddBlogUrl. Exécutez la commande Add-Migration AddBlogUrl dans la console du gestionnaire de package. Le dossier Migrations contient une nouvelle migration AddBlogUrl. Le nom de fichier de migration contient le préfixe d'un horodateur pour faciliter le tri. Exécutez la commande Update-Database dans la console du gestionnaire de package. Migrations Code First
Faite les exercices. Exercice
Questions?