📝 added SQLiteInMemory in providers section
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
80f3b0834e
commit
a2a882f71a
@ -0,0 +1,113 @@
|
|||||||
|
---
|
||||||
|
sidebar_label: '5.5. SQLite In Memory'
|
||||||
|
sidebar_position: 5
|
||||||
|
description: "explique comment utiliser le fournisseur SQLite In Memory"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Utilisation du fournisseur SQLite In Memory
|
||||||
|
*02/02/2023 ⋅ Marc Chevaldonné*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
:::note base de données en mémoire
|
||||||
|
Cette méthode utilise SQLite à travers une base de données directement en mémoire, et donc, non stockée.
|
||||||
|
Sa durée de vie est donc limitée à l'exécution du programme.
|
||||||
|
Cette méthode est donc préconisée pour des tests unitaires ou fonctionnels.
|
||||||
|
:::
|
||||||
|
|
||||||
|
*Utilisez l'une ou l'autre des 2 méthodes suivantes.*
|
||||||
|
|
||||||
|
## Méthode 1 : en modifiant une classe fille de ```DbContext```
|
||||||
|
Il faut d'abord modifier du code, puis lancer les commandes de migration et de création de la base de données.
|
||||||
|
|
||||||
|
### NuGet
|
||||||
|
Depuis Visual Studio (mac ou windows), installez les packages NuGet suivants, dans le projet contenant votre ```DbContext``` et vos entités :
|
||||||
|
- Microsoft.EntityFrameworkCore
|
||||||
|
- Microsoft.EntityFrameworkCore.Tools
|
||||||
|
- Microsoft.EntityFrameworkCore.SQLite
|
||||||
|
|
||||||
|
### Code
|
||||||
|
Dans votre classe héritant de ```DbContext```, utilisez la méthode d'extension ```UseSqlite```.
|
||||||
|
|
||||||
|
```csharp MyDbContext
|
||||||
|
public class MyDbContext : DbContext
|
||||||
|
{
|
||||||
|
//...
|
||||||
|
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
|
{
|
||||||
|
//...
|
||||||
|
var connection = new SqliteConnection("DataSource=:memory:");
|
||||||
|
connection.Open();
|
||||||
|
optionsBuilder.UseSqlite(connection);
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
De plus, au moment de l'instanciation de votre contexte, n'oubliez pas de vérifier ou de créer la base de données procéduralement de la manière suivante :
|
||||||
|
```csharp Program.cs (ou tout autre endroit ou le contexte est initialisé)
|
||||||
|
var context = new MyDbContext();
|
||||||
|
await context.Database.EnsureCreatedAsync();
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour le reste de votre projet EntityFrameworkCore, aucune différence avec les méthodes présentées précédemment.
|
||||||
|
|
||||||
|
### Migrations et création de la base de données
|
||||||
|
Il n'est pas nécessaire de créer des migrations ou la table en utilisant les lignes de commande.
|
||||||
|
|
||||||
|
## Méthode 2 : injection de ```DbContextOptions```
|
||||||
|
Cette méthode permet d'utiliser une classe héritant de ```DbContext``` (```TheDbContext``` par exemple) sans en changer le code.
|
||||||
|
|
||||||
|
:::caution Condition sur ```OnConfiguring```
|
||||||
|
Il faut néanmoins que la classe fille de ```DbContext``` (par exemple ```TheDbContext```) :
|
||||||
|
1. possède un constructeur permettant de passer un ```DbContextOptions``` en paramètre.
|
||||||
|
```csharp TheDbContext
|
||||||
|
public TheDbContext(DbContextOptions<TheDbContext> options)
|
||||||
|
: base(options)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
```
|
||||||
|
2. n'impose pas un fournisseur et une chaîne de connexion dans la méthode OnConfiguring,
|
||||||
|
par exemple à l'aide d'un ```if(!optionsBuilder.IsConfigured)```
|
||||||
|
```csharp TheDbContext
|
||||||
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||||
|
{
|
||||||
|
if(!optionsBuilder.IsConfigured)
|
||||||
|
{
|
||||||
|
optionsBuilder.Use...(...);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
:::
|
||||||
|
|
||||||
|
### NuGet
|
||||||
|
Depuis Visual Studio (mac ou windows), installez les packages NuGet suivants, dans le projet contenant votre ```DbContext``` et vos entités
|
||||||
|
(cela devrait déjà être fait si vous vous injectez un nouveau fournisseur dans un ```DbContext``` existant déjà) :
|
||||||
|
- Microsoft.EntityFrameworkCore
|
||||||
|
- Microsoft.EntityFrameworkCore.Tools
|
||||||
|
|
||||||
|
Puis installez le package Nuget suivant dans le projet qui contiendra la création des options et l'injection dans le contexte
|
||||||
|
(le projet de démarrage par exemple) :
|
||||||
|
- Npgsql.EntityFrameworkCore.Sqlite
|
||||||
|
|
||||||
|
### Code
|
||||||
|
On peut dès lors, avant la création du contexte, créer des options permettant de choisir le fournisseur de la manière suivante :
|
||||||
|
```csharp Program.cs (ou autre)
|
||||||
|
var connection = new SqliteConnection("DataSource=:memory:");
|
||||||
|
connection.Open();
|
||||||
|
var options = new DbContextOptionsBuilder<TheDbContext>()
|
||||||
|
.UseSqlite(connection)
|
||||||
|
.Options;
|
||||||
|
var context = new TheDbContext(options);
|
||||||
|
await context.Database.EnsureCreatedAsync();
|
||||||
|
```
|
||||||
|
|
||||||
|
* Les deux premières lignes permettent d'ouvrir une connexion de type Sqlite vers une base de données en mémoire en spécifiant la chaîne de connexion (```"DataSource=:memory:"```), spéciale pour SqliteInMemory.
|
||||||
|
* La troisième crée les options en spécifiant le fournisseur ```UseSqlite``` et la connexion (donc le fait qu'on utilise SqliteInMemory).
|
||||||
|
* La quatrième ligne crée le contexte en injectant ces options.
|
||||||
|
* La cinquième ligne s'assure que la base de données est bien créée ou qu'elle existait déjà.
|
||||||
|
|
||||||
|
:::note migrations ?
|
||||||
|
Avec cette méthode, il n'est pas nécessaire de créer les migrations ou la base de données en lignes de commande.
|
||||||
|
:::
|
Loading…
Reference in new issue