finished ex_042_004

EFCore3_Reforged
Marc CHEVALDONNE 6 years ago
parent 57f501c0f1
commit 45984239ea

@ -1,4 +1,5 @@
using Microsoft.Data.SqlClient; using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Linq; using System.Linq;
using static System.Console; 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 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 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 try
{ {
@ -33,17 +34,30 @@ namespace ex_042_004_ValueGeneration_conventions
db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok }); db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok });
db.SaveChanges(); 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) foreach (var n in db.NounoursSet)
{ {
WriteLine($"\t{n}"); WriteLine($"\t{n}");
} }
//essai d'ajout d'un Nounours existant //essai d'ajout d'un Nounours existant
try
{
WriteLine("\nTry to insert an existing entity");
chewie.Nom = "Chewie"; chewie.Nom = "Chewie";
db.NounoursSet.Add(chewie); db.NounoursSet.Add(chewie);
db.SaveChanges(); 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) catch (SqlException)
{ {

@ -66,10 +66,11 @@ Si on utilise des conventions d'écriture :
### La classe ```Program``` ### La classe ```Program```
Cette classe est le point d'entrée du programme : 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 ```csharp
Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; 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 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 * Elle démarre une connexion à la base de données
```csharp ```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. * 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```. Elle ajoute ensuite les ```Nounours```et sauvegarde les changements pour que ceux-ci soit effectivement ajoutés à la base.
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. 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._ _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 ```csharp
//nettoyage de la base de données
if (db.NounoursSet.Count() > 0) if (db.NounoursSet.Count() > 0)
{ {
WriteLine("La base n'est pas vide !");
foreach (var n in db.NounoursSet) 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); db.NounoursSet.Remove(n);
} }
WriteLine("Base avant sauvegarde des changements :");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
db.SaveChanges(); 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(); 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) foreach (var n in db.NounoursSet)
{ {
WriteLine($"\t{n}"); 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 ? ## 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. 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*. * 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 : * 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*: *Note*:
si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également : 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 : * Migration :
``` ```
dotnet ef migrations add migration_ex_042_001 dotnet ef migrations add migration_ex_042_004
``` ```
* Création de la table : * Création de la table :
``` ```
dotnet ef database update dotnet ef database update
``` ```
* Génération et exécution * 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 ? * 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*. 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*, * *SQL Server*,
* puis *(localdb)\MSSQLLocalDB ...*, * puis *(localdb)\MSSQLLocalDB ...*,
* puis *Bases de données* * 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* * puis *Tables*
* Faites un clic droit sur la table *dbo.Nounours* puis choisissez *Afficher les données* * Faites un clic droit sur la table *dbo.Nounours* puis choisissez *Afficher les données*
<img src="../ex_041_001_ConnectionStrings/readmefiles/sqlserver_02.png" width="460"/> <img src="../ex_041_001_ConnectionStrings/readmefiles/sqlserver_02.png" width="460"/>
@ -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 |1|Chewbacca|27/05/1977 00:00:00|1234567
|2|Yoda|21/05/1980 00:00:00|3 |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.* *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.*
Loading…
Cancel
Save