From 9a1d01e179dfc32e8c6a8ee8e5ffa80b1ac4003b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Chevaldonn=C3=A9?= Date: Mon, 13 Jan 2020 23:36:26 +0100 Subject: [PATCH] cleaning old samples --- .../Nounours.cs | 103 --------------- .../NounoursDBEntities.cs | 36 ----- .../Program.cs | 124 ------------------ ...ex_042_001_EF_CodeFirst_conventions.csproj | 21 --- .../Nounours.cs | 119 ----------------- .../NounoursDBEntities.cs | 34 ----- .../Program.cs | 124 ------------------ ...2_002_EF_CodeFirst_data_annotations.csproj | 24 ---- .../Nounours.cs | 100 -------------- .../NounoursDBEntities.cs | 86 ------------ ex_042_003_EF_CodeFirst_Fluent_API/Program.cs | 119 ----------------- .../ex_042_003_EF_CodeFirst_Fluent_API.csproj | 24 ---- .../DbContextInitializer.cs | 53 -------- .../Nounours.cs | 104 --------------- .../NounoursDBEntities.cs | 29 ---- .../Program.cs | 108 --------------- ...42_004_EF_CF_InitializationStrategy.csproj | 21 --- .../DbContextInitializer.cs | 70 ---------- ex_042_005_EF_CF_Seeding_Data/Nounours.cs | 104 --------------- .../NounoursDBEntities.cs | 29 ---- ex_042_005_EF_CF_Seeding_Data/Program.cs | 108 --------------- .../ex_042_005_EF_CF_Seeding_Data.csproj | 21 --- 22 files changed, 1561 deletions(-) delete mode 100644 ex_042_001_EF_CodeFirst_conventions/Nounours.cs delete mode 100644 ex_042_001_EF_CodeFirst_conventions/NounoursDBEntities.cs delete mode 100644 ex_042_001_EF_CodeFirst_conventions/Program.cs delete mode 100644 ex_042_001_EF_CodeFirst_conventions/ex_042_001_EF_CodeFirst_conventions.csproj delete mode 100644 ex_042_002_EF_CodeFirst_data_annotations/Nounours.cs delete mode 100644 ex_042_002_EF_CodeFirst_data_annotations/NounoursDBEntities.cs delete mode 100644 ex_042_002_EF_CodeFirst_data_annotations/Program.cs delete mode 100644 ex_042_002_EF_CodeFirst_data_annotations/ex_042_002_EF_CodeFirst_data_annotations.csproj delete mode 100644 ex_042_003_EF_CodeFirst_Fluent_API/Nounours.cs delete mode 100644 ex_042_003_EF_CodeFirst_Fluent_API/NounoursDBEntities.cs delete mode 100644 ex_042_003_EF_CodeFirst_Fluent_API/Program.cs delete mode 100644 ex_042_003_EF_CodeFirst_Fluent_API/ex_042_003_EF_CodeFirst_Fluent_API.csproj delete mode 100644 ex_042_004_EF_CF_InitializationStrategy/DbContextInitializer.cs delete mode 100644 ex_042_004_EF_CF_InitializationStrategy/Nounours.cs delete mode 100644 ex_042_004_EF_CF_InitializationStrategy/NounoursDBEntities.cs delete mode 100644 ex_042_004_EF_CF_InitializationStrategy/Program.cs delete mode 100644 ex_042_004_EF_CF_InitializationStrategy/ex_042_004_EF_CF_InitializationStrategy.csproj delete mode 100644 ex_042_005_EF_CF_Seeding_Data/DbContextInitializer.cs delete mode 100644 ex_042_005_EF_CF_Seeding_Data/Nounours.cs delete mode 100644 ex_042_005_EF_CF_Seeding_Data/NounoursDBEntities.cs delete mode 100644 ex_042_005_EF_CF_Seeding_Data/Program.cs delete mode 100644 ex_042_005_EF_CF_Seeding_Data/ex_042_005_EF_CF_Seeding_Data.csproj diff --git a/ex_042_001_EF_CodeFirst_conventions/Nounours.cs b/ex_042_001_EF_CodeFirst_conventions/Nounours.cs deleted file mode 100644 index f48f93c..0000000 --- a/ex_042_001_EF_CodeFirst_conventions/Nounours.cs +++ /dev/null @@ -1,103 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Nounours.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; - -namespace ex_042_001_EF_CodeFirst_conventions -{ - /// - /// Nounours est une classe POCO, i.e. Plain Old CLR Object. - /// Elle contient 3 propriétés en lecture/écriture : Nom, DateDeNaissance et NbPoils. Nous parlerons de la 4ème (ID) dans un moment. - /// Entity Framework va utiliser la classe POCO Nounours pour créer une table dans la base de données, lorsque le DbSet va être créé (nous verrons ça dans la classe NounoursDBEntities). - /// - /// L'utilisation des conventions d'écriture d'Entity Framework font que la table qui va être créée aura : - /// - un nom correspondant au nom de la classe POCO : ici "Nounours" - /// - une colonne pour chaque propriété publique : ici, "Nom", "DateDeNaissance" et "NbPoils" - /// - /// De plus, en rajoutant une propriété de type int et avec le nom "ID", Entity Framework ajoute directement une colonne "ID" et l'utilise comme clé primaire. - /// - public class Nounours - { - public int ID - { - get; set; - } - - public string Nom - { - get; - set; - } - - public DateTime DateDeNaissance - { - get; - set; - } - - public int NbPoils - { - get; - set; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nom.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - public override bool Equals(object right) - { - //check null - if (object.ReferenceEquals(right, null)) - { - return false; - } - - if (object.ReferenceEquals(this, right)) - { - return true; - } - - if (this.GetType() != right.GetType()) - { - return false; - } - - return this.Equals(right as Nounours); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(Nounours other) - { - return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance); - } - - public override string ToString() - { - return $"{ID}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; - } - - } -} diff --git a/ex_042_001_EF_CodeFirst_conventions/NounoursDBEntities.cs b/ex_042_001_EF_CodeFirst_conventions/NounoursDBEntities.cs deleted file mode 100644 index 1816354..0000000 --- a/ex_042_001_EF_CodeFirst_conventions/NounoursDBEntities.cs +++ /dev/null @@ -1,36 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : NounoursDBEntities.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; - -namespace ex_042_001_EF_CodeFirst_conventions -{ - /// - /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle. - /// Cette classe contient un DbSet pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours. - /// - /// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé - /// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici - /// dans App.config. - /// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants. - /// - class NounoursDBEntities : DbContext - { - public virtual DbSet NounoursSet { get; set; } - - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - // optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Initial Catalog=ex_042_001_EF_CodeFirst_conventions;Integrated Security=SSPI;AttachDBFileName=|DataDirectory|\ex_042_001_EF_CodeFirst_conventions.mdf"); - optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_001_EF_CodeFirst_conventions.Nounours.mdf;Trusted_Connection=True;"); - } - } -} diff --git a/ex_042_001_EF_CodeFirst_conventions/Program.cs b/ex_042_001_EF_CodeFirst_conventions/Program.cs deleted file mode 100644 index 585f2df..0000000 --- a/ex_042_001_EF_CodeFirst_conventions/Program.cs +++ /dev/null @@ -1,124 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Program.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; -using System.Linq; -using static System.Console; - -namespace ex_042_001_EF_CodeFirst_conventions -{ - /// - /// Ce premier exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement - /// une base à partir de vos classes métier, en profitant des conventions de nommage d'Entity Framework. - /// - /// Contrairement à EntityFramework 6 dans le .NET framework 4.6, il y a un "petit peu" plus de travail à fournir, mais pas des masses... :) - /// Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien, - /// - dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package), - /// - dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions) - /// - tapez : dotnet restore (pour restaurer les packages .NET Core) - /// - tapez : dotnet ef migrations add MyFirstMigration - /// note : vous pourrez détruire le dossier Migrations une fois la base créée - /// - tapez : dotnet ef database update - /// Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO. - /// Dans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf - /// - /// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities. - /// 1/ Nounours -> voir commentaires dans la classe Nounours - /// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities - /// - /// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée). - /// Celle-ci donne accès à la DbSet à laquelle nous rajoutons 3 Nounours. - /// Mais avant cela, nous vérifions qu'ils n'existent pas déjà en base, et si c'est le cas, nous les détruisons. - /// - /// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges. - /// - /// - /// Pour visualiser les résultats, vous pouvez : - /// - aller dans Affichage -> Explorateur d'objets SQL Server - /// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données - /// -> ex_042_001_EF_CodeFirst_conventions -> Tables -> dbo.Nounours - /// en cliquant sur dbo.Nounours vous pourrez voir la table - /// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table - /// - /// - class Program - { - static void Main(string[] args) - { - OutputEncoding = System.Text.Encoding.UTF8; - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 }; - Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 }; - - try - { - using (NounoursDBEntities db = new NounoursDBEntities()) - { - if (db.NounoursSet.Count() > 0) - { - WriteLine("La base n'est pas vide !"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - WriteLine("début du nettoyage..."); - } - foreach (var n in db.NounoursSet.ToArray()) - { - WriteLine($"Suppression de {n}"); - db.NounoursSet.Remove(n); - } - - WriteLine("Base avant sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - db.SaveChanges(); - WriteLine("Base après sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou }); - - db.SaveChanges(); - WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - } - } - catch (Exception) - { - WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple."); - WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :"); - WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,"); - WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),"); - WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions)"); - WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)"); - WriteLine("- tapez : dotnet ef migrations add MyFirstMigration"); - WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée"); - WriteLine("- tapez : dotnet ef database update"); - WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO."); - WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf"); - } - - ReadLine(); - } - } -} diff --git a/ex_042_001_EF_CodeFirst_conventions/ex_042_001_EF_CodeFirst_conventions.csproj b/ex_042_001_EF_CodeFirst_conventions/ex_042_001_EF_CodeFirst_conventions.csproj deleted file mode 100644 index 514202f..0000000 --- a/ex_042_001_EF_CodeFirst_conventions/ex_042_001_EF_CodeFirst_conventions.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - netcoreapp3.0 - ex_042_001_EF_CodeFirst_conventions - Exe - ex_042_001_EF_CodeFirst_conventions - 3.0.1 - false - false - false - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/ex_042_002_EF_CodeFirst_data_annotations/Nounours.cs b/ex_042_002_EF_CodeFirst_data_annotations/Nounours.cs deleted file mode 100644 index 2aa8948..0000000 --- a/ex_042_002_EF_CodeFirst_data_annotations/Nounours.cs +++ /dev/null @@ -1,119 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Nounours.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace ex_042_002_EF_CodeFirst_data_annotations -{ - /// - /// Nounours est une classe POCO, i.e. Plain Old CLR Object. - /// Nous avons vu dans l'exemple précédent comment utiliser les conventions d'écriture. Cette méthode est pratique mais ne nous laisse pas beaucoup - /// de possibilités de modifier la table selon nos désirs. - /// Cet exemple montre comment utiliser les data annotations. En voici quelques exemples principaux : - /// - la classe utilise l'annotation [Table("TableNounours")] qui permet de modifier le nom de la table dans la base de données - /// - la propriété DateDeNaissance a une annotation "Column" permettant de choisir un nom pour la colonne - /// - la propriété Nom n'a pas d'annotation "Column", c'est donc la convention d'écriture qui s'applique pour le nom de la colonne => "Nom" - /// - la propriété Nom a une annotation "Required" qui indique que le champ est obligatoire - /// - la propriété Nom a une annotation MaxLength indiquant combien de caractères peut avoir le Nom au maximum dans la base de données - /// - la propriété NbPoils a une annotation NotMapped indiquant qu'il n'y aura pas de colonne associée à cette propriété dans la table - /// - la propriété UniqueId a une annotation Key pour indiquer que c'est cette propriété qu'il faut utiliser comme clé primaire - /// - la propriété UniqueId a également une annotation DatabaseGenerated permettant d'indiquer que c'est lors de l'insertion dans la table qu'une - /// clé primaire (ici de type Guid, et pas obligatoirement int) lui sera attribuée - /// - /// Il existe d'autres annotations que vous pouvez découvrir et utiliser par la suite comme ForeignKey, TimeStamp, ConcurrencyCheck, CreditCard, - /// EmailAddress, Phone, StringLength, Url... - /// - [Table("TableNounours")] - public class Nounours - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid UniqueId - { - get; set; - } - - [Required] - [MaxLength(256)] - public string Nom - { - get; - set; - } - - [Column("Naissance")] - public DateTime DateDeNaissance - { - get; - set; - } - - [NotMapped] - public int NbPoils - { - get; - set; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nom.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - public override bool Equals(object right) - { - //check null - if (object.ReferenceEquals(right, null)) - { - return false; - } - - if (object.ReferenceEquals(this, right)) - { - return true; - } - - if (this.GetType() != right.GetType()) - { - return false; - } - - return this.Equals(right as Nounours); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(Nounours other) - { - return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance); - } - - public override string ToString() - { - return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; - } - - } -} diff --git a/ex_042_002_EF_CodeFirst_data_annotations/NounoursDBEntities.cs b/ex_042_002_EF_CodeFirst_data_annotations/NounoursDBEntities.cs deleted file mode 100644 index 3c1bfac..0000000 --- a/ex_042_002_EF_CodeFirst_data_annotations/NounoursDBEntities.cs +++ /dev/null @@ -1,34 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : NounoursDBEntities.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-12 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; - -namespace ex_042_002_EF_CodeFirst_data_annotations -{ - /// - /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle. - /// Cette classe contient un DbSet pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours. - /// - /// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé - /// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici - /// dans App.config. - /// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants. - /// - class NounoursDBEntities : DbContext - { - public virtual DbSet NounoursSet { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_002_EF_CodeFirst_data_annotations.Nounours.mdf;Trusted_Connection=True;"); - } - } -} diff --git a/ex_042_002_EF_CodeFirst_data_annotations/Program.cs b/ex_042_002_EF_CodeFirst_data_annotations/Program.cs deleted file mode 100644 index 6d9613c..0000000 --- a/ex_042_002_EF_CodeFirst_data_annotations/Program.cs +++ /dev/null @@ -1,124 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Program.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; -using static System.Console; -using System.Linq; - -namespace ex_042_002_EF_CodeFirst_data_annotations -{ - /// - /// Ce deuxième exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement - /// une base à partir de vos classes métier, en profitant des data annotations d'Entity Framework. - /// - /// Seule la classe Nounours est différente. Tout le reste de l'exemple est le même que le précédent. - /// - /// Contrairement à EntityFramework 6 dans le .NET framework 4.6, il y a un "petit peu" plus de travail à fournir, mais pas des masses... :) - /// Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien, - /// - dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package), - /// - dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions) - /// - tapez : dotnet restore (pour restaurer les packages .NET Core) - /// - tapez : dotnet ef migrations add MyFirstMigration - /// note : vous pourrez détruire le dossier Migrations une fois la base créée - /// - tapez : dotnet ef database update - /// Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO. - /// Dans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf - /// - /// - /// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities. - /// 1/ Nounours -> voir commentaires dans la classe Nounours - /// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities - /// - /// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée). - /// Celle-ci donne accès à la DbSet à laquelle nous rajoutons 3 Nounours. - /// - /// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges. - /// - /// Pour visualiser les résultats, vous pouvez : - /// - aller dans Affichage -> Explorateur d'objets SQL Server - /// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données - /// -> ex_042_002_EF_CodeFirst_data_annotations -> Tables -> dbo.TableNounours - /// en cliquant sur dbo.TableNounours vous pourrez voir la table - /// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table - /// - class Program - { - static void Main(string[] args) - { - OutputEncoding = System.Text.Encoding.UTF8; - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 }; - Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 }; - - try - { - using (NounoursDBEntities db = new NounoursDBEntities()) - { - if (db.NounoursSet.Count() > 0) - { - WriteLine("La base n'est pas vide !"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - WriteLine("début du nettoyage..."); - } - foreach (var n in db.NounoursSet.ToArray()) - { - WriteLine($"Suppression de {n}"); - db.NounoursSet.Remove(n); - } - - WriteLine("Base avant sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - db.SaveChanges(); - WriteLine("Base après sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou }); - - db.SaveChanges(); - WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - } - } - catch (Exception) - { - WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple."); - WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :"); - WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,"); - WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),"); - WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_002_EF_CodeFirst_data_annotations)"); - WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)"); - WriteLine("- tapez : dotnet ef migrations add MyFirstMigration"); - WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée"); - WriteLine("- tapez : dotnet ef database update"); - WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO."); - WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf"); - } - - ReadLine(); - } - } -} diff --git a/ex_042_002_EF_CodeFirst_data_annotations/ex_042_002_EF_CodeFirst_data_annotations.csproj b/ex_042_002_EF_CodeFirst_data_annotations/ex_042_002_EF_CodeFirst_data_annotations.csproj deleted file mode 100644 index 42b36bc..0000000 --- a/ex_042_002_EF_CodeFirst_data_annotations/ex_042_002_EF_CodeFirst_data_annotations.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - netcoreapp3.0 - ex_042_002_EF_CodeFirst_data_annotations - Exe - ex_042_002_EF_CodeFirst_data_annotations - 3.0.1 - false - false - false - - - - - All - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/ex_042_003_EF_CodeFirst_Fluent_API/Nounours.cs b/ex_042_003_EF_CodeFirst_Fluent_API/Nounours.cs deleted file mode 100644 index f42c166..0000000 --- a/ex_042_003_EF_CodeFirst_Fluent_API/Nounours.cs +++ /dev/null @@ -1,100 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Nounours.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; - -namespace ex_042_003_EF_CodeFirst_Fluent_API -{ - /// - /// Nounours est une classe POCO, i.e. Plain Old CLR Object. - /// Elle contient 4 propriétés en lecture/écriture : Nom, DateDeNaissance, NbPoils et UniqueId. - /// Entity Framework va utiliser la classe POCO Nounours pour créer une table dans la base de données, lorsque le DbSet va être créé (nous verrons ça dans la classe NounoursDBEntities). - /// - /// Dans cet exemple, nous n'utilisons pas les annotations de données (data annotations) et nous n'utiliserons pas non plus implicitement les conventions d'écriture - /// d'Entity Framework car nous allons les réécrire dans la classe NounoursDBEntities. - /// - public class Nounours - { - public Guid UniqueId - { - get; set; - } - - public string Nom - { - get; - set; - } - - public DateTime DateDeNaissance - { - get; - set; - } - - public int NbPoils - { - get; - set; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nom.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - public override bool Equals(object right) - { - //check null - if (object.ReferenceEquals(right, null)) - { - return false; - } - - if (object.ReferenceEquals(this, right)) - { - return true; - } - - if (this.GetType() != right.GetType()) - { - return false; - } - - return this.Equals(right as Nounours); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(Nounours other) - { - return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance); - } - - public override string ToString() - { - return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; - } - - } -} diff --git a/ex_042_003_EF_CodeFirst_Fluent_API/NounoursDBEntities.cs b/ex_042_003_EF_CodeFirst_Fluent_API/NounoursDBEntities.cs deleted file mode 100644 index 9a4c552..0000000 --- a/ex_042_003_EF_CodeFirst_Fluent_API/NounoursDBEntities.cs +++ /dev/null @@ -1,86 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : NounoursDBEntities.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-12 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; - -namespace ex_042_003_EF_CodeFirst_Fluent_API -{ - /// - /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle. - /// Cette classe contient un DbSet pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours. - /// - /// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé - /// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici - /// dans App.config. - /// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants. - /// - /// Contrairement aux 2 exemples précédents, nous n'utilisons pas les conventions d'écriture, ni les annotations de données pour utiliser créer la table - /// à partir de la classe Nounours. Nous allons cette fois-ci utiliser la Fluent API et réécrire dans la classe NounoursDBEntities dérivant de DbContext - /// de quelle manière créer la table à partir de la classe Nounours. - /// - /// Cette méthode est préférable dans les deux cas principaux suivants (et en particulier le 1er) : - /// - nous n'avons pas accès au code source de la classe Nounours ou bien nous n'avons pas le droit de le modifier, et les conventions d'écriture ne - /// correspondent pas à ce que nous souhaitons réaliser. - /// - nous ne souhaitons pas "polluer" la classe POCO avec des annotations de données. - /// - /// L'inconvénient majeur et évident de cette méthode est que la lecture et la maintenance sont plus compliquées. - /// - /// Pour utiliser la Fluent API et décrire de quelle manière créer la table à partir de la classe POCO, il faut réécrire la méthode virtuelle OnModelCreating - /// (cf. commentaires de la méthode ci-dessous). - /// - /// L'exemple ci-dessous recrée exactement la même table que dans l'exemple précédent. - /// - class NounoursDBEntities : DbContext - { - public virtual DbSet NounoursSet { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_003_EF_CodeFirst_Fluent_API.Nounours.mdf;Trusted_Connection=True;"); - } - - /// - /// méthode appelée lors de la création du modèle. - /// - /// - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - //ici on précise comment s'appellera la table associée à la classe POCO Nounours - //équivalent du [Table("TableNounours")] avec les annotations de données - modelBuilder.Entity().ToTable("TableNounours"); - - //ici on précise que la propriété UniqueId de Nounours est la clef primaire - //équivalent de [Key] devant la propriété UniqueId dans Nounours - modelBuilder.Entity().HasKey(n => n.UniqueId); - - //ici on explique que c'est lors de l'insertion en base que la clef primaire sera générée - //équivalent de [DatabaseGenerated(DatabaseGeneratedOption.Identity)] devant la propriété UniqueId de Nounours - modelBuilder.Entity().Property(n => n.UniqueId).ValueGeneratedOnAdd(); - //HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); - - //ici on précise que la propriété Nom est obligatoire et que sa taille maximale est de 256 caractères - //Notez l'utilisation des méthodes chaînées ! Trop beau ! Tellement pratique, intuitif et évident... - //équivalent de [Required] et [MaxLength(256)] devant la propriété Nom de Nounours - modelBuilder.Entity().Property(n => n.Nom).IsRequired() - .HasMaxLength(256); - - //ici on donne un nom à la colonne associée à la propriété DateDeNaissance - //équivalent de [Column("Naissance")] devant la propriété DateDeNaissance de Nounours - modelBuilder.Entity().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); - - //ici on précise que la propriété NbPoils ne sera pas insérée en base - //équivalent de [NotMapped] devant la propriété NbPoils de Nounours - modelBuilder.Entity().Ignore(n => n.NbPoils); - - base.OnModelCreating(modelBuilder); - } - } -} diff --git a/ex_042_003_EF_CodeFirst_Fluent_API/Program.cs b/ex_042_003_EF_CodeFirst_Fluent_API/Program.cs deleted file mode 100644 index c4556aa..0000000 --- a/ex_042_003_EF_CodeFirst_Fluent_API/Program.cs +++ /dev/null @@ -1,119 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Program.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-16 -// -// ======================================================================== - -using System; -using static System.Console; -using System.Linq; - -namespace ex_042_003_EF_CodeFirst_Fluent_API -{ - /// - /// Ce troisième exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement - /// une base à partir de vos classes métier, en profitant de l'API Fluent d'Entity Framework. - /// - /// Ici, nous n'expliquerons pas comment utiliser la chaîne de connection ; référez-vous aux exemples suivants pour plus d'informations. - /// Elle est définie dans le fichier App.config avec le nom NounoursDBContext. - /// - /// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities. - /// 1/ Nounours -> voir commentaires dans la classe Nounours - /// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities - /// C'est cette classe NounoursDBEntities qui explique comment traduire Nounours en Table. - /// - /// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée). - /// Celle-ci donne accès à la DbSet à laquelle nous rajoutons 3 Nounours. - /// - /// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges. - /// - /// Pour visualiser les résultats, vous pouvez : - /// - aller dans Affichage -> Explorateur d'objets SQL Server - /// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données - /// -> ex_042_003_EF_CodeFirst_Fluent_API -> Tables -> dbo.TableNounours - /// en cliquant sur dbo.TableNounours vous pourrez voir la table - /// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table - /// - /// Si vous exécutez une deuxième fois le projet après avoir modifié la classe Nounours, celui-ci ne marchera pas - /// car la table créée n'aura plus les bonnes caractéristiques correspondant à la classe Nounours. - /// Vous pouvez pour cela effacer la base, avec un clic droit sur ex_042_003_EF_CodeFirst_Fluent_API -> Supprimer - /// puis relancer le programme. - /// - class Program - { - static void Main(string[] args) - { - OutputEncoding = System.Text.Encoding.UTF8; - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 }; - Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 }; - - try - { - using (NounoursDBEntities db = new NounoursDBEntities()) - { - if (db.NounoursSet.Count() > 0) - { - WriteLine("La base n'est pas vide !"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - WriteLine("début du nettoyage..."); - } - foreach (var n in db.NounoursSet.ToArray()) - { - WriteLine($"Suppression de {n}"); - db.NounoursSet.Remove(n); - } - - WriteLine("Base avant sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - db.SaveChanges(); - WriteLine("Base après sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou }); - - db.SaveChanges(); - WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - } - } - catch (Exception) - { - WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple."); - WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :"); - WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,"); - WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),"); - WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_003_EF_CodeFirst_Fluent_API)"); - WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)"); - WriteLine("- tapez : dotnet ef migrations add MyFirstMigration"); - WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée"); - WriteLine("- tapez : dotnet ef database update"); - WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO."); - WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf"); - } - - ReadLine(); - } - } -} diff --git a/ex_042_003_EF_CodeFirst_Fluent_API/ex_042_003_EF_CodeFirst_Fluent_API.csproj b/ex_042_003_EF_CodeFirst_Fluent_API/ex_042_003_EF_CodeFirst_Fluent_API.csproj deleted file mode 100644 index 81dcedf..0000000 --- a/ex_042_003_EF_CodeFirst_Fluent_API/ex_042_003_EF_CodeFirst_Fluent_API.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - netcoreapp3.0 - ex_042_003_EF_CodeFirst_Fluent_API - Exe - ex_042_003_EF_CodeFirst_Fluent_API - 3.0.1 - false - false - false - - - - - All - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/ex_042_004_EF_CF_InitializationStrategy/DbContextInitializer.cs b/ex_042_004_EF_CF_InitializationStrategy/DbContextInitializer.cs deleted file mode 100644 index e3bda6c..0000000 --- a/ex_042_004_EF_CF_InitializationStrategy/DbContextInitializer.cs +++ /dev/null @@ -1,53 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : DbContextInitializer.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; -using System; - -namespace ex_042_004_EF_CF_InitializationStrategy -{ - /// - /// initialiseur de stratégies... - /// - public static class DbContextInitializer - { - /// - /// les différentes stratégies de création de la base - /// - public enum InitializationStrategies - { - CreateDatabaseIfNotExists, - DropCreateDatabaseIfModelChanges, - DropCreateDatabaseAlways - } - public static void SetInitializer(DbContext context, InitializationStrategies strategy) - { - switch(strategy) - { - //par défaut : crée la base seulement si elle n'existe pas - default: - case InitializationStrategies.CreateDatabaseIfNotExists: - context.Database.EnsureCreated(); - break; - - //recrée la base même si elle existe déjà - case InitializationStrategies.DropCreateDatabaseAlways: - context.Database.EnsureDeleted(); - context.Database.EnsureCreated(); - break; - - //recrée la base seulement si le modèle change : impossible aujourd'hui en Entity Framework Core... - case InitializationStrategies.DropCreateDatabaseIfModelChanges: - throw new NotImplementedException("Le mode DropCreateDatabaseIfModelChanges ne peut pas encore exister sous Entity Framework Core"); - } - } - } -} diff --git a/ex_042_004_EF_CF_InitializationStrategy/Nounours.cs b/ex_042_004_EF_CF_InitializationStrategy/Nounours.cs deleted file mode 100644 index 8cc0854..0000000 --- a/ex_042_004_EF_CF_InitializationStrategy/Nounours.cs +++ /dev/null @@ -1,104 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Nounours.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace ex_042_004_EF_CF_InitializationStrategy -{ - /// - /// Nounours est une classe POCO, i.e. Plain Old CLR Object. - /// - [Table("TableNounours")] - public class Nounours - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid UniqueId - { - get; set; - } - - [Required] - [MaxLength(256)] - public string Nom - { - get; - set; - } - - [Column("Naissance")] - public DateTime DateDeNaissance - { - get; - set; - } - - [NotMapped] - public int NbPoils - { - get; - set; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nom.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - public override bool Equals(object right) - { - //check null - if (object.ReferenceEquals(right, null)) - { - return false; - } - - if (object.ReferenceEquals(this, right)) - { - return true; - } - - if (this.GetType() != right.GetType()) - { - return false; - } - - return this.Equals(right as Nounours); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(Nounours other) - { - return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance); - } - - public override string ToString() - { - return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; - } - - } -} diff --git a/ex_042_004_EF_CF_InitializationStrategy/NounoursDBEntities.cs b/ex_042_004_EF_CF_InitializationStrategy/NounoursDBEntities.cs deleted file mode 100644 index 50689f5..0000000 --- a/ex_042_004_EF_CF_InitializationStrategy/NounoursDBEntities.cs +++ /dev/null @@ -1,29 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : NounoursDBEntities.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; - -namespace ex_042_004_EF_CF_InitializationStrategy -{ - /// - /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle. - /// Cette classe contient un DbSet pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours. - /// - class NounoursDBEntities : DbContext - { - public virtual DbSet NounoursSet { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_004_EF_CF_InitializationStrategy.Nounours.mdf;Trusted_Connection=True;"); - } - } -} diff --git a/ex_042_004_EF_CF_InitializationStrategy/Program.cs b/ex_042_004_EF_CF_InitializationStrategy/Program.cs deleted file mode 100644 index a204ae0..0000000 --- a/ex_042_004_EF_CF_InitializationStrategy/Program.cs +++ /dev/null @@ -1,108 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Program.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using System; -using static System.Console; -using System.Linq; - -namespace ex_042_004_EF_CF_InitializationStrategy -{ - /// - /// Cet exemple présente les différentes stratégies d'initialisation de la base de données. - /// - /// Dans Entity Framework 6 pour .NET Framework (cf. ex_042_004 des exemples .NET Framework), il existe des stratégies d'initialisation. - /// Il n'y a malheureusement pas d'équivalent pour Entity Framework Core. - /// - /// Cet exemple reprend le 042_002 tout en proposant une méthode permettant de modifier les stratégies d'initialisation. - /// Pour cela, cet exemple propose l'écriture d'une classe statique DbContextInitializer, mais toutes les stratégies ne sont néanmoins pas reproductibles. - /// - class Program - { - static void Main(string[] args) - { - OutputEncoding = System.Text.Encoding.UTF8; - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 }; - Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 }; - - try - { - using (NounoursDBEntities db = new NounoursDBEntities()) - { - //choix de la stratégie - DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.CreateDatabaseIfNotExists); - //DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.DropCreateDatabaseAlways); - //DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.DropCreateDatabaseIfModelChanges); - - if (db.NounoursSet.Count() > 0) - { - WriteLine("La base n'est pas vide !"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - WriteLine("début du nettoyage..."); - } - foreach (var n in db.NounoursSet.ToArray()) - { - WriteLine($"Suppression de {n}"); - db.NounoursSet.Remove(n); - } - - WriteLine("Base avant sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - db.SaveChanges(); - WriteLine("Base après sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou }); - - db.SaveChanges(); - WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - } - } - catch(NotImplementedException exception) - { - WriteLine(exception.Message); - } - catch (Exception) - { - WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple."); - WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :"); - WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,"); - WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),"); - WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_004_EF_CF_InitializationStrategy)"); - WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)"); - WriteLine("- tapez : dotnet ef migrations add MyFirstMigration"); - WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée"); - WriteLine("- tapez : dotnet ef database update"); - WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO."); - WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf"); - } - - ReadLine(); - } - } -} diff --git a/ex_042_004_EF_CF_InitializationStrategy/ex_042_004_EF_CF_InitializationStrategy.csproj b/ex_042_004_EF_CF_InitializationStrategy/ex_042_004_EF_CF_InitializationStrategy.csproj deleted file mode 100644 index a1c6c7e..0000000 --- a/ex_042_004_EF_CF_InitializationStrategy/ex_042_004_EF_CF_InitializationStrategy.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - netcoreapp3.0 - ex_042_004_EF_CF_InitializationStrategy - Exe - ex_042_004_EF_CF_InitializationStrategy - 3.0.1 - false - false - false - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/ex_042_005_EF_CF_Seeding_Data/DbContextInitializer.cs b/ex_042_005_EF_CF_Seeding_Data/DbContextInitializer.cs deleted file mode 100644 index 904e146..0000000 --- a/ex_042_005_EF_CF_Seeding_Data/DbContextInitializer.cs +++ /dev/null @@ -1,70 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : DbContextInitializer.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; -using System; - -namespace ex_042_005_EF_CF_Seeding_Data -{ - /// - /// initialiseur de stratégies... - /// - public static class DbContextInitializer - { - /// - /// remplissage de la base avec des données stubbées. - /// - /// base à remplir - public static void Seed(NounoursDBEntities context) - { - SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways); - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - - context.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok }); - - context.SaveChanges(); - } - - /// - /// les différentes stratégies de création de la base - /// - public enum InitializationStrategies - { - CreateDatabaseIfNotExists, - DropCreateDatabaseIfModelChanges, - DropCreateDatabaseAlways - } - public static void SetInitializer(DbContext context, InitializationStrategies strategy) - { - switch(strategy) - { - //par défaut : crée la base seulement si elle n'existe pas - default: - case InitializationStrategies.CreateDatabaseIfNotExists: - context.Database.EnsureCreated(); - break; - - //recrée la base même si elle existe déjà - case InitializationStrategies.DropCreateDatabaseAlways: - context.Database.EnsureDeleted(); - context.Database.EnsureCreated(); - break; - - //recrée la base seulement si le modèle change : impossible aujourd'hui en Entity Framework Core... - case InitializationStrategies.DropCreateDatabaseIfModelChanges: - throw new NotImplementedException("Le mode DropCreateDatabaseIfModelChanges ne peut pas encore exister sous Entity Framework Core"); - } - } - } -} diff --git a/ex_042_005_EF_CF_Seeding_Data/Nounours.cs b/ex_042_005_EF_CF_Seeding_Data/Nounours.cs deleted file mode 100644 index dd46342..0000000 --- a/ex_042_005_EF_CF_Seeding_Data/Nounours.cs +++ /dev/null @@ -1,104 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Nounours.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace ex_042_005_EF_CF_Seeding_Data -{ - /// - /// Nounours est une classe POCO, i.e. Plain Old CLR Object. - /// - [Table("TableNounours")] - public class Nounours - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid UniqueId - { - get; set; - } - - [Required] - [MaxLength(256)] - public string Nom - { - get; - set; - } - - [Column("Naissance")] - public DateTime DateDeNaissance - { - get; - set; - } - - [NotMapped] - public int NbPoils - { - get; - set; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nom.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - public override bool Equals(object right) - { - //check null - if (object.ReferenceEquals(right, null)) - { - return false; - } - - if (object.ReferenceEquals(this, right)) - { - return true; - } - - if (this.GetType() != right.GetType()) - { - return false; - } - - return this.Equals(right as Nounours); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(Nounours other) - { - return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance); - } - - public override string ToString() - { - return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; - } - - } -} diff --git a/ex_042_005_EF_CF_Seeding_Data/NounoursDBEntities.cs b/ex_042_005_EF_CF_Seeding_Data/NounoursDBEntities.cs deleted file mode 100644 index 61deec0..0000000 --- a/ex_042_005_EF_CF_Seeding_Data/NounoursDBEntities.cs +++ /dev/null @@ -1,29 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : NounoursDBEntities.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using Microsoft.EntityFrameworkCore; - -namespace ex_042_005_EF_CF_Seeding_Data -{ - /// - /// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle. - /// Cette classe contient un DbSet pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours. - /// - public class NounoursDBEntities : DbContext - { - public virtual DbSet NounoursSet { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_005_EF_CF_Seeding_Data.Nounours.mdf;Trusted_Connection=True;"); - } - } -} diff --git a/ex_042_005_EF_CF_Seeding_Data/Program.cs b/ex_042_005_EF_CF_Seeding_Data/Program.cs deleted file mode 100644 index 159da25..0000000 --- a/ex_042_005_EF_CF_Seeding_Data/Program.cs +++ /dev/null @@ -1,108 +0,0 @@ -// ======================================================================== -// -// Copyright (C) 2016-2017 MARC CHEVALDONNE -// marc.chevaldonne.free.fr -// -// Module : Program.cs -// Author : Marc Chevaldonné -// Creation date : 2016-10-17 -// -// ======================================================================== - -using System; -using static System.Console; -using System.Linq; - -namespace ex_042_005_EF_CF_Seeding_Data -{ - /// - /// Cet exemple présente les différentes stratégies d'initialisation de la base de données. - /// - /// Dans Entity Framework 6 pour .NET Framework (cf. ex_042_004 des exemples .NET Framework), il existe des stratégies d'initialisation. - /// Il n'y a malheureusement pas d'équivalent pour Entity Framework Core. - /// - /// Cet exemple reprend le 042_002 tout en proposant une méthode permettant de modifier les stratégies d'initialisation. - /// Pour cela, cet exemple propose l'écriture d'une classe statique DbContextInitializer, mais toutes les stratégies ne sont néanmoins pas reproductibles. - /// - /// De plus, elle montre comment injecter des données stubbées pour permettre de rapidement tester la base. - /// - class Program - { - static void Main(string[] args) - { - OutputEncoding = System.Text.Encoding.UTF8; - - Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; - Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; - Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; - Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 }; - Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 }; - - try - { - using (NounoursDBEntities db = new NounoursDBEntities()) - { - //choix de la stratégie et remplissage avec des données stubbées - DbContextInitializer.Seed(db); - - if (db.NounoursSet.Count() > 0) - { - WriteLine("La base n'est pas vide !"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - WriteLine("début du nettoyage..."); - } - foreach (var n in db.NounoursSet.ToArray()) - { - WriteLine($"Suppression de {n}"); - db.NounoursSet.Remove(n); - } - - WriteLine("Base avant sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - db.SaveChanges(); - WriteLine("Base après sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou }); - - db.SaveChanges(); - WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); - foreach (var n in db.NounoursSet) - { - WriteLine($"\t{n}"); - } - - } - } - catch (NotImplementedException exception) - { - WriteLine(exception.Message); - } - catch (Exception) - { - WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple."); - WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :"); - WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,"); - WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),"); - WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_005_EF_CF_Seeding_Data)"); - WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)"); - WriteLine("- tapez : dotnet ef migrations add MyFirstMigration"); - WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée"); - WriteLine("- tapez : dotnet ef database update"); - WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO."); - WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf"); - } - - ReadLine(); - } - } -} diff --git a/ex_042_005_EF_CF_Seeding_Data/ex_042_005_EF_CF_Seeding_Data.csproj b/ex_042_005_EF_CF_Seeding_Data/ex_042_005_EF_CF_Seeding_Data.csproj deleted file mode 100644 index ad96d71..0000000 --- a/ex_042_005_EF_CF_Seeding_Data/ex_042_005_EF_CF_Seeding_Data.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - netcoreapp3.0 - ex_042_005_EF_CF_Seeding_Data - Exe - ex_042_005_EF_CF_Seeding_Data - 3.0.1 - false - false - false - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - -