updated sample with connection strings

EFCore3_Reforged
Marc CHEVALDONNE 6 years ago
parent a0b861dd73
commit e908e0aa49

@ -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())
{

@ -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
<StartWorkingDirectory>$(MSBuildProjectDirectory)</StartWorkingDirectory>
```
## 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

@ -10,6 +10,6 @@ namespace ex_041_001_ConnectionStrings
public DbSet<Nounours> 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");
}
}

@ -9,11 +9,11 @@
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="3.1.0" />-->
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />-->
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<!--<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>-->
</PackageReference>
</ItemGroup>
</Project>

Loading…
Cancel
Save