From e908e0aa49f3cb46b50011fa29cb1faf0d7f21bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Chevaldonn=C3=A9?= Date: Tue, 31 Dec 2019 12:17:21 +0100 Subject: [PATCH] updated sample with connection strings --- .../ex_041_001_ConnectionStrings/Program.cs | 18 ++-- .../ex_041_001_ConnectionStrings/ReadMe.md | 95 +++++++++++++++++-- .../SQLiteContext.cs | 2 +- .../ex_041_001_ConnectionStrings.csproj | 8 +- 4 files changed, 100 insertions(+), 23 deletions(-) diff --git a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/Program.cs b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/Program.cs index 6587676..875fb65 100644 --- a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/Program.cs +++ b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/Program.cs @@ -10,15 +10,15 @@ namespace ex_041_001_ConnectionStrings Nounours yoda = new Nounours { Nom = "Yoda" }; Nounours ewok = new Nounours { Nom = "Ewok" }; - //using (var context = new SqlServerContext()) - //{ - // // Crée des nounours et les insère dans la base - // Console.WriteLine("Creates and inserts new Nounours"); - // context.Add(chewie); - // context.Add(yoda); - // context.Add(ewok); - // context.SaveChanges(); - //} + using (var context = new SqlServerContext()) + { + // Crée des nounours et les insère dans la base + Console.WriteLine("Creates and inserts new Nounours"); + context.Add(chewie); + context.Add(yoda); + context.Add(ewok); + context.SaveChanges(); + } using (var context = new SQLiteContext()) { diff --git a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ReadMe.md b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ReadMe.md index 246c9bf..59c8fd9 100644 --- a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ReadMe.md +++ b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ReadMe.md @@ -1,17 +1,94 @@ # ex_041_001_ConnectionStrings Cet exemple a pour but de présenter les chaîne de connexion (*connection strings*). +* Les *connection strings* servent à se connecter à une base de données. +* Elles diffèrent en fonction des *providers* +* Parfois, elles nécessitent des informations telles que un nom d'utilisateur et un mot de passe qu'on peut vouloir cacher -Servent à se connecter à une base de données -diffèrent en fonction des providers -parfois, elles nécessitent login/pwd_ +Dans cet exemple, j'ai voulu montrer deux *connection strings* : une pour SQL Server et une autre pour SQLite. +## Configuration +Il faut penser à ajouter les NuGet suivants : +* Microsoft.EntityFrameworkCore : pour le projet en général +* Microsoft.EntityFrameworkCore.SqlServer : pour le *provider* SQL Server +* Microsoft.EntityFrameworkCore.Sqlite : pour le *provider* SQLite +* Microsoft.EntityFrameworkCore.Tools : pour bénéficier des outils de Design, de migrations, etc. + + +De plus, pour SQLite, il faut penser également à rajouter dans l'exemple : -2 providers -pour sqlite, il faut rajouter les nugets, le chemin du starting working directory +* le chemin du *starting working directory* : on peut le faire par exemple en modifiant le **.csproj** en ajoutant la ligne suivante : +```xml +$(MSBuildProjectDirectory) +``` + +## Comment fonctionne l'exemple ? +Ce projet contient les classes suivantes : +* ```Nounours``` : elle est la classe du modèle que j'ai faite la plus simple possible. J'expliquerai dans un exemple ultérieure son mode de fonctionnement. Elle contient un ```Id```et un ```Nom``` qui donneront deux colonnes dans une table Nounours avec les mêmes noms. +* ```SqlServerContext``` : première classe qui dérive de ```DbContext``` et qui va permettre de réaliser la connexion avec la base de données de type MSSqlServer +* ```SQLiteContext``` : deuxième classe qui dérive de ```DbContext```et qui va permettre de réaliser la connexion avec la base de données de type SQLite. + +Dans les deux classes qui dérivent de ```DbContext```, on doit donner une *connection string*. Celle-ci est donnée via la méthode protégée et virtuelle ```OnConfiguring```, +via l'instance de ```DbContextOptionsBuilder```, à travers l'une des méthodes d'extension : +* ```UseSqlServer``` : pour SqlServer, où on peut voir une *connection string* plus ou moins complexe indiquant qu'elle est en local (```Server=(localdb)\mssqllocaldb;```), ainsi que le nom de la base de données (```Database=ex_041_001_ConnectionStrings.Nounours.mdf;```) +* ```UseSqlite``` : pour SQLite, où on peut voir le nom de la base de données ```Data Source=ex_041_001_ConnectionStrings.Nounours.db``` qui sera placée par défaut dans le dossier du projet si vous l'exécutez depuis Visual Studio. + +C'est tout ce que cet exemple souhaite mettre en valeur : les chaînes de connexion. + +## Comment générer et exécuter l'exemple ? +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, ici : +``` +cd .\p08_BDD_EntityFramework\ex_041_001_ConnectionStrings +``` + +*Note*: +si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également : + +```dotnet tool install --global dotnet-ef``` + +### Migrations +*Note :* normalement, la commande pour effectuer une migration est : +``` +dotnet ef migrations add monNomDeMigration +``` +mais comme ici, nous sommes dans le cas particulier où nous avons deux contextes, nous devons préciser les noms des ```DbContext```à migrer : +``` +dotnet ef migrations add ex_041_001_SqlServer --context SqlServerContext +dotnet ef migrations add ex_041_001_SQLite --context SQLiteContext +``` +### Création des tables +Tapez ensuite les commandes suivantes : +``` +dotnet ef database update --context SqlServerContext +dotnet ef database update --context SQLiteContext +``` +### Génération et exécution +Vous pouvez maintenant générer et exécuter l'exemple. + +## Comment vérifier le contenu des bases de données SQL Server et SQLite ? +### SqlServer +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 : *myFirstDatabase.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 : + + |Id |Nom |Naissance |NbPoils + |---|---|---|--- + |1|Chewbacca|27/05/1977 00:00:00|1234567 + |2|Yoda|21/05/1980 00:00:00|3 + |3|Wicket|25/05/1983 00:00:00|3456789 + +Notez qu'il est possible d'utiliser l'*Explorateur d'objets SQL Server* pour ajouter, modifier ou supprimer des données dans les tables. + +### SQLite on peut observer le contenu avec DB browser : https://sqlitebrowser.org/dl/ -todo : faire fonctionner avec les deux providers -préciser la différence pour les migrations -dotnet ef migrations add ex_041_001_ConnectionStrings --context SQLiteContext -dotnet ef database update --context SQLiteContext \ No newline at end of file diff --git a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/SQLiteContext.cs b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/SQLiteContext.cs index 90399b3..a8fc417 100644 --- a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/SQLiteContext.cs +++ b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/SQLiteContext.cs @@ -10,6 +10,6 @@ namespace ex_041_001_ConnectionStrings public DbSet Nounours { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) - => options.UseSqlite($"Data Source=Nounours.db"); + => options.UseSqlite($"Data Source=ex_041_001_ConnectionStrings.Nounours.db"); } } diff --git a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ex_041_001_ConnectionStrings.csproj b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ex_041_001_ConnectionStrings.csproj index b512e4b..2fea5ab 100644 --- a/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ex_041_001_ConnectionStrings.csproj +++ b/p08_BDD_EntityFramework/ex_041_001_ConnectionStrings/ex_041_001_ConnectionStrings.csproj @@ -9,11 +9,11 @@ - - + + - all - runtime; build; native; contentfiles; analyzers; buildtransitive +