diff --git a/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/Program.cs b/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/Program.cs index 7a1fed1..12c7d71 100644 --- a/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/Program.cs +++ b/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/Program.cs @@ -1,4 +1,5 @@ using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; using System; using System.Linq; using static System.Console; @@ -13,7 +14,7 @@ namespace ex_042_004_ValueGeneration_conventions 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 ewok = new Nounours (); try { @@ -33,16 +34,29 @@ namespace ex_042_004_ValueGeneration_conventions db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok }); db.SaveChanges(); - WriteLine("Base après nettoyage et ajout des 3 nounours et sauvegarde des changements :"); + WriteLine("database after cleaning and adding 3 Nounours and saving changes :"); foreach (var n in db.NounoursSet) { WriteLine($"\t{n}"); } //essai d'ajout d'un Nounours existant - chewie.Nom = "Chewie"; - db.NounoursSet.Add(chewie); - db.SaveChanges(); + try + { + WriteLine("\nTry to insert an existing entity"); + chewie.Nom = "Chewie"; + db.NounoursSet.Add(chewie); + db.SaveChanges(); + } + catch (DbUpdateException exc) + { + WriteLine(exc.Message); + } + + WriteLine("\nDisplay the last Nounours with default values"); + Nounours e = db.NounoursSet.ToList().Last(); + string nameStr = e.Nom != null ? e.Nom : "null"; + WriteLine($"Name: {nameStr}; BirthDate: {e.DateDeNaissance}; Hair count: {e.NbPoils}"); } } catch (SqlException) diff --git a/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/ReadMe.md b/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/ReadMe.md index a2c08ea..92c95c1 100644 --- a/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/ReadMe.md +++ b/p08_BDD_EntityFramework/ex_042_004_ValueGeneration_conventions/ReadMe.md @@ -65,11 +65,12 @@ Si on utilise des conventions d'écriture : ### La classe ```Program``` Cette classe est le point d'entrée du programme : -* Elle crée des instances de ```Nounours``` +* Elle crée des instances de ```Nounours``` +Notez que la dernière ne donne aucune valeur pour les propriétés pour tester les valeurs par défaut. ```csharp 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 ewok = new Nounours (); ``` * Elle démarre une connexion à la base de données ```csharp @@ -79,56 +80,59 @@ using (NounoursDBEntities db = new NounoursDBEntities()) } ``` * Elle vérifie si la table est vide, et si ce n'est pas le cas, elle la vide. -Notez l'accès à la table de ```Nounours``` via ```db.NounoursSet```. -Notez également que tant que ```SaveChanges``` n'est pas appelée, les suppressions ne sont pas effectives dans la base, seulement en local dans le programme. +Elle ajoute ensuite les ```Nounours```et sauvegarde les changements pour que ceux-ci soit effectivement ajoutés à la base. +Notez la création automatique des ID. _Cette partie de l'exemple ne s'exécutera que si la base existe déjà, par exemple lors d'une deuxième exécution._ ```csharp +//nettoyage de la base de données 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}"); - } } -``` -* Elle ajoute ensuite les ```Nounours```et sauvegarde les changements pour que ceux-ci soit effectivement ajoutés à la base. -```csharp -db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok }); +//ajout des nounours dans la base de données +db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok }); db.SaveChanges(); -WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :"); + +WriteLine("database after cleaning and adding 3 Nounours and saving changes :"); foreach (var n in db.NounoursSet) { WriteLine($"\t{n}"); } -``` +``` +* Elle tente d'ajouter une entité dont l'ID n'est pas l'identifiant par défaut (0) à la base. Ceci lance une ```DbUpdateException```. +```csharp +//essai d'ajout d'un Nounours existant +try +{ + WriteLine("\nTry to insert an existing entity"); + chewie.Nom = "Chewie"; + db.NounoursSet.Add(chewie); + db.SaveChanges(); +} +catch (DbUpdateException exc) +{ + WriteLine(exc.Message); +} +``` +* Elle affiche les valeurs des propriétés du dernier Nounours pour montrer les valeurs par défaut : ```null``` pour le ```string```, ```0``` pour l'```int```, ```01/01/0001 00:00:00``` pour le ```DateTime```. +```csharp +WriteLine("\nDisplay the last Nounours with default values"); +Nounours e = db.NounoursSet.ToList().Last(); +string nameStr = e.Nom != null ? e.Nom : "null"; +WriteLine($"Name: {nameStr}; BirthDate: {e.DateDeNaissance}; Hair count: {e.NbPoils}"); +``` ## 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_001_EF_CF_conventions +cd .\p08_BDD_EntityFramework\ex_042_004_ValueGeneration_conventions ``` *Note*: si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également : @@ -137,14 +141,14 @@ cd .\p08_BDD_EntityFramework\ex_042_001_EF_CF_conventions * Migration : ``` -dotnet ef migrations add migration_ex_042_001 +dotnet ef migrations add migration_ex_042_004 ``` * 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_001_EF_CF_conventions**. +Vous pouvez maintenant générer et exécuter l'exemple **ex_042_004_ValueGeneration_conventions**. * Comment vérifier le contenu des bases de données SQL Server et SQLite ? Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'objets SQL Server*. @@ -155,7 +159,7 @@ Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'obj * *SQL Server*, * puis *(localdb)\MSSQLLocalDB ...*, * puis *Bases de données* - * puis celle portant le nom de votre migration, dans mon cas : *ex_042_001_EF_CF_conventions.NounoursSet.mdf* + * puis celle portant le nom de votre migration, dans mon cas : *ex_042_004_ValueGeneration_conventions.Nounours.mdf* * puis *Tables* * Faites un clic droit sur la table *dbo.Nounours* puis choisissez *Afficher les données* @@ -166,6 +170,6 @@ Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'obj |---|---|---|--- |1|Chewbacca|27/05/1977 00:00:00|1234567 |2|Yoda|21/05/1980 00:00:00|3 - |3|Ewok|25/05/1983 00:00:00|3456789 + |3|NULL|01/01/0001 00:00:00|0 *Note: les identifiants peuvent varier en fonction du nombre d'exécution de l'exemple depuis la création de la base de données.* \ No newline at end of file