From 923fcef868b1dc142aa91df9b50c77e14b378756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Chevaldonn=C3=A9?= Date: Mon, 13 Jan 2020 23:29:43 +0100 Subject: [PATCH] added ex_042_008_DataSeeding before EF 2.1 --- Exemples.sln | 46 +++---- p08_BDD_EntityFramework/ReadMe.md | 3 +- .../DataSeeder.cs | 19 +++ .../Nounours.cs | 46 +++++++ .../NounoursDBEntities.cs | 14 +++ .../Program.cs | 50 ++++++++ .../ReadMe.md | 115 ++++++++++++++++++ ...x_042_008_DataSeeding_before_EF2.1.csproj} | 3 +- .../DbContextInitializer.cs | 53 -------- .../Nounours.cs | 104 ---------------- .../NounoursDBEntities.cs | 29 ----- .../Program.cs | 108 ---------------- p08_BDD_EntityFramework/temp.md | 2 +- 13 files changed, 272 insertions(+), 320 deletions(-) create mode 100644 p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/DataSeeder.cs create mode 100644 p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Nounours.cs create mode 100644 p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/NounoursDBEntities.cs create mode 100644 p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Program.cs create mode 100644 p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ReadMe.md rename p08_BDD_EntityFramework/{ex_042_008_InitializationStrategy/ex_042_008_InitializationStrategy.csproj => ex_042_008_DataSeeding_before_EF2.1/ex_042_008_DataSeeding_before_EF2.1.csproj} (79%) delete mode 100644 p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/DbContextInitializer.cs delete mode 100644 p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Nounours.cs delete mode 100644 p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/NounoursDBEntities.cs delete mode 100644 p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Program.cs diff --git a/Exemples.sln b/Exemples.sln index d9a49e8..f3fc6fd 100644 --- a/Exemples.sln +++ b/Exemples.sln @@ -566,9 +566,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_006_Keys_FluentAPI", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_007_ValueGeneration", "p08_BDD_EntityFramework\ex_042_007_ValueGeneration\ex_042_007_ValueGeneration.csproj", "{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. Initialization Strategy and Seeding Data with CodeFirst", "03. Initialization Strategy and Seeding Data with CodeFirst", "{78374D80-5BE7-425D-BE62-AD8F26491112}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. Data Seeding", "03. Data Seeding", "{78374D80-5BE7-425D-BE62-AD8F26491112}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ex_042_008_InitializationStrategy", "p08_BDD_EntityFramework\ex_042_008_InitializationStrategy\ex_042_008_InitializationStrategy.csproj", "{3C9128AD-B677-460B-A1E1-D5B8B1491157}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_008_DataSeeding_before_EF2.1", "p08_BDD_EntityFramework\ex_042_008_DataSeeding_before_EF2.1\ex_042_008_DataSeeding_before_EF2.1.csproj", "{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -4706,26 +4706,26 @@ Global {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x64.Build.0 = Release|Any CPU {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.ActiveCfg = Release|Any CPU {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.Build.0 = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.ActiveCfg = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.Build.0 = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.Build.0 = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.ActiveCfg = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.Build.0 = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.ActiveCfg = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.Build.0 = Debug|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.Build.0 = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.ActiveCfg = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.Build.0 = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.ActiveCfg = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.Build.0 = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.ActiveCfg = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.Build.0 = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.ActiveCfg = Release|Any CPU - {3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.Build.0 = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.ActiveCfg = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.Build.0 = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.Build.0 = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.ActiveCfg = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.Build.0 = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.ActiveCfg = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.Build.0 = Debug|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.Build.0 = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.ActiveCfg = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.Build.0 = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.ActiveCfg = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.Build.0 = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.ActiveCfg = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.Build.0 = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.ActiveCfg = Release|Any CPU + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -4995,7 +4995,7 @@ Global {64EA0021-231A-421F-A616-3973C0106E99} = {5B333C02-67B7-4A4C-AA58-2710C183292B} {DA7ADAF3-34FF-4B97-8306-EF490A7A713A} = {5B333C02-67B7-4A4C-AA58-2710C183292B} {78374D80-5BE7-425D-BE62-AD8F26491112} = {55E00151-58A6-4E7D-9457-0BB8213B82F5} - {3C9128AD-B677-460B-A1E1-D5B8B1491157} = {78374D80-5BE7-425D-BE62-AD8F26491112} + {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5} = {78374D80-5BE7-425D-BE62-AD8F26491112} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8D31C3AE-36FF-4667-A2A7-0E670245A59E} diff --git a/p08_BDD_EntityFramework/ReadMe.md b/p08_BDD_EntityFramework/ReadMe.md index 7a4e8e5..73f152e 100644 --- a/p08_BDD_EntityFramework/ReadMe.md +++ b/p08_BDD_EntityFramework/ReadMe.md @@ -1,5 +1,5 @@ # Entity Framework Core 3.0 -*06/01/2020 ⋅ Marc Chevaldonné* +*13/01/2020 ⋅ Marc Chevaldonné* --- Entity Framework (EF) Core est un ORM (Object-Relational Mapper) qui permet aux développeurs .NET de gérer de manière simple, légère et extensible, des bases de données. @@ -29,6 +29,7 @@ Ce chapitre s'attardera sur le lien entre le mod * **ex_042_005 : Keys with data annotations** : explique comment créer les clés primaires d'une entité lorsqu'on utilise les *data annotations*. * **ex_042_006 : Keys with Fluent API** : explique comment créer les clés primaires d'une entité lorsqu'on utilise la *Fluent API*. * **ex_042_007 : Value Generation** : explique comment faire générer des valeurs automatiquement lors de l'insertion ou de la mise à jour + * **ex_042_008 : Data Seeding before Entity Framework 2.1** : explique comment utiliser un stub (méthode qui était recommandée avant EF Core 2.1) 3. *Schemas and migrations* : Le but de ce chapitre sera de vous montrer comment garder votre modèle et votre base de données synchronisés. diff --git a/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/DataSeeder.cs b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/DataSeeder.cs new file mode 100644 index 0000000..8051a30 --- /dev/null +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/DataSeeder.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using System; + +namespace ex_042_008_DataSeeding_before_EF2_1 +{ + public static class DataSeeder + { + public static void SeedData(DbContext context) + { + 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.AddRange(new Nounours[] { chewie, yoda, ewok }); + + context.SaveChanges(); + } + } +} diff --git a/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Nounours.cs b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Nounours.cs new file mode 100644 index 0000000..174c524 --- /dev/null +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Nounours.cs @@ -0,0 +1,46 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ex_042_008_DataSeeding_before_EF2_1 +{ + [Table("TableNounours")] + public class Nounours + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid UniqueId + { + get; set; + } + + [Required] + [MaxLength(256)] + //[Column("name", Order=0, TypeName ="varchar(200)")] + public string Nom + { + get; + set; + } + + [Column("Naissance", TypeName = "date")] + public DateTime DateDeNaissance + { + get; + set; + } + + [NotMapped] + public int NbPoils + { + get; + set; + } + + public override string ToString() + { + return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)"; + } + + } +} diff --git a/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/NounoursDBEntities.cs b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/NounoursDBEntities.cs new file mode 100644 index 0000000..ff127e5 --- /dev/null +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/NounoursDBEntities.cs @@ -0,0 +1,14 @@ +using Microsoft.EntityFrameworkCore; + +namespace ex_042_008_DataSeeding_before_EF2_1 +{ + class NounoursDBEntities : DbContext + { + public virtual DbSet NounoursSet { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_008_DataSeeding_before_EF2_1.Nounours.mdf;Trusted_Connection=True;"); + } + } +} diff --git a/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Program.cs b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Program.cs new file mode 100644 index 0000000..d01ca2b --- /dev/null +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/Program.cs @@ -0,0 +1,50 @@ +using Microsoft.Data.SqlClient; +using System; +using System.Linq; +using static System.Console; + +namespace ex_042_008_DataSeeding_before_EF2_1 +{ + class Program + { + static void Main(string[] args) + { + OutputEncoding = System.Text.Encoding.UTF8; + + try + { + using (NounoursDBEntities db = new NounoursDBEntities()) + { + //Nettoyage + if (db.NounoursSet.Count() > 0) + { + WriteLine("nettoyage de la base car elle n'était pas vide"); + foreach (var n in db.NounoursSet) + { + db.NounoursSet.Remove(n); + } + db.SaveChanges(); + } + + //Seeding + WriteLine("remplissage avec du stub"); + DataSeeder.SeedData(db); + + WriteLine("Contenu de la base :"); + foreach (var n in db.NounoursSet) + { + WriteLine($"\t{n}"); + } + + } + } + catch (SqlException) + { + 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 données dans le fichier ReadMe.md associé à cet exemple."); + } + + ReadLine(); + } + } +} diff --git a/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ReadMe.md b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ReadMe.md new file mode 100644 index 0000000..7fc3f24 --- /dev/null +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ReadMe.md @@ -0,0 +1,115 @@ +# ex_042_008_DataSeeding_before_EF2.1 +*13/01/2020 ⋅ Marc Chevaldonné* + +--- + +Cet exemple montre comment il était recommandé d'utiliser du Stub avec Entity Framework Core avant la version 2.1. +Il est conseillé d'utiliser une méthode plus moderne (cf. ex_042_009_DataSeeding). + +--- + +## Comment est construit cet exemple ? +* Le projet est de type .NET Core +* Il contient deux classes : + * ```Nounours``` + * ```NounoursDBEntities``` + * ```DataSeeder``` + +Le contenu des classes ```Nounours``` et ```NounoursDBEntities``` correspond à ce qui a été vu dans les exemples précédents. Seule la classe ```DataSeeder``` sera donc expliquée ici. + +### La classe ```DataSeeder``` + +* ```DataSeeder``` est une classe statique possédant une méthode ```SeedData``` dont le but est d'ajouter des éléments à la base. +```csharp +using Microsoft.EntityFrameworkCore; +using System; + +namespace ex_042_008_DataSeeding_before_EF2_1 +{ + public static class DataSeeder + { + public static void SeedData(DbContext context) + { + 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.AddRange(new Nounours[] { chewie, yoda, ewok }); + + context.SaveChanges(); + } + } +} +``` +* Elle est utilisée dans ```Program``` pour remplir la base. +```csharp +using (NounoursDBEntities db = new NounoursDBEntities()) +{ + //... + DataSeeder.SeedData(db); + //... +} +``` + +## Comment exécuter cet exemple ? +Pour tester cette application, n'oubliez pas les commandes comme présentées dans l'exemple ex_041_001 : pour générer l'exemple, il vous faut d'abord préparer les migrations et les tables. + * Ouvrez la *Console du Gestionnaire de package*, pour cela, dirigez-vous dans le menu *Outils*, puis *Gestionnaire de package NuGet*, puis *Console du Gestionnaire de package*. + * Dans la console que vous venez d'ouvrir, déplacez-vous dans le dossier du projet .NET Core, ici : +``` +cd .\p08_BDD_EntityFramework\ex_042_008_DataSeeding_before_EF2_1 +``` + *Note*: + si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également : + +* ```dotnet tool install --global dotnet-ef``` si vous utilisez la dernière version de .NET Core (3.1 aujourd'hui), + +* ```dotnet tool install --global dotnet-ef --version 3.0.0``` si vous vous utiliser spécifiquement .NET Core 3.0. + + + * Migration : +``` +dotnet ef migrations add migration_ex_042_008 +``` + * Création de la table : +``` +dotnet ef database update +``` + * Génération et exécution +Vous pouvez maintenant générer et exécuter l'exemple **ex_042_008_DataSeeding_before_EF2.1**. + + * Le résultat de l'exécution peut ressembler à : + ``` +nettoyage de la base car elle n'était pas vide +remplissage avec du stub +Contenu de la base : + 9540729e-67d9-442c-63fb-08d798777717: Chewbacca (27/05/1977, 1234567 poils) + df1ce76a-97ee-42c7-63fc-08d798777717: Yoda (21/05/1980, 3 poils) + 0b921251-12a6-480a-63fd-08d798777717: Ewok (25/05/1983, 3456789 poils) +``` +_Note : les identifiants seront bien sûr différents_ + + * Comment vérifier le contenu des bases de données SQL Server ? +Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'objets SQL Server*. +* Pour cela, allez dans le menu *Affichage* puis *Explorateur d'objets SQL Server*. + + +* Déployez dans l'*Explorateur d'objets SQL Server* : + * *SQL Server*, + * puis *(localdb)\MSSQLLocalDB ...*, + * puis *Bases de données* + * puis celle portant le nom de votre migration, dans mon cas : *ex_042_008_DataSeeding_before_EF2_1.Nounours.mdf* + * puis *Tables* + * Faites un clic droit sur la table *dbo.Nounours* puis choisissez *Afficher les données* + + + * Vous devriez maintenant pouvoir voir les données suivantes dans le tableau : + + |UniqueId |Nom|Naissance + |---|---|--- + |9540729e-67d9-442c-63fb-08d798777717|Chewbacca|27/05/1977 + |df1ce76a-97ee-42c7-63fc-08d798777717|Yoda|21/05/1980 + |0b921251-12a6-480a-63fd-08d798777717|Ewok|25/05/1983 + +*Notes: les identifiants seront bien sûr différents.* +*Notez l'absence de la colonne "NbPoils"* +*Notez le nom de la colonne "Naissance" et le formatage de la date* \ No newline at end of file diff --git a/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/ex_042_008_InitializationStrategy.csproj b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ex_042_008_DataSeeding_before_EF2.1.csproj similarity index 79% rename from p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/ex_042_008_InitializationStrategy.csproj rename to p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ex_042_008_DataSeeding_before_EF2.1.csproj index dc4bf52..a803d28 100644 --- a/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/ex_042_008_InitializationStrategy.csproj +++ b/p08_BDD_EntityFramework/ex_042_008_DataSeeding_before_EF2.1/ex_042_008_DataSeeding_before_EF2.1.csproj @@ -1,8 +1,9 @@ - + Exe netcoreapp3.0 + ex_042_008_DataSeeding_before_EF2_1 diff --git a/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/DbContextInitializer.cs b/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/DbContextInitializer.cs deleted file mode 100644 index 2435c2b..0000000 --- a/p08_BDD_EntityFramework/ex_042_008_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_008_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/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Nounours.cs b/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Nounours.cs deleted file mode 100644 index f97eb1c..0000000 --- a/p08_BDD_EntityFramework/ex_042_008_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_008_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/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/NounoursDBEntities.cs b/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/NounoursDBEntities.cs deleted file mode 100644 index 983fbd9..0000000 --- a/p08_BDD_EntityFramework/ex_042_008_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_008_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_008_InitializationStrategy.Nounours.mdf;Trusted_Connection=True;"); - } - } -} diff --git a/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Program.cs b/p08_BDD_EntityFramework/ex_042_008_InitializationStrategy/Program.cs deleted file mode 100644 index 92caf98..0000000 --- a/p08_BDD_EntityFramework/ex_042_008_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_008_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/p08_BDD_EntityFramework/temp.md b/p08_BDD_EntityFramework/temp.md index fa7ee76..55ab5d0 100644 --- a/p08_BDD_EntityFramework/temp.md +++ b/p08_BDD_EntityFramework/temp.md @@ -14,7 +14,7 @@ * V 001, 002, 003 entity types, entity properties * V 004, 005, 006 keys, 007 generated values * ? backing fields? -* initialization strategy, seeding data +* 008 seeding data * shadow properties * ###### relationships * single navigation property