Maui and EF
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
f46946c926
commit
26a0bc8d16
@ -0,0 +1,135 @@
|
||||
---
|
||||
sidebar_label: '6.1. MAUI, EF et SQLite'
|
||||
sidebar_position: 1
|
||||
description: "explique comment utiliser le fournisseur SQLite et Entity Framework dans une application MAUI"
|
||||
---
|
||||
import Mermaid from '@theme/Mermaid';
|
||||
|
||||
# Utilisation du fournisseur SQLite, via Entity Framework, dans une application MAUI
|
||||
*23/02/2023 ⋅ Marc Chevaldonné*
|
||||
|
||||
---
|
||||
|
||||
:::info Pré-requis
|
||||
Cette page n'explique pas comment écrire un ```DbContext``` ou comment utiliser *Entity Framework*.
|
||||
Référez-vous aux articles précédents pour récupérer ces informations.
|
||||
:::
|
||||
|
||||
## Structure
|
||||
|
||||
Considérons une application **MAUI_App** consommant une bibliothèque de classe **EFLib**
|
||||
contenant une classe fille de ```DbContext```, appelée ```MyDbContext```.
|
||||
|
||||
<Mermaid chart={`
|
||||
flowchart LR
|
||||
MAUI_App ..> EFLib
|
||||
`}/>
|
||||
|
||||
```MyDbContext``` possède un constructeur permettant l'injection d'un ```DbContextOptions<MyDbContext>``` afin de proposer le fournisseur de son choix et la chaîne de connexion adaptée.
|
||||
|
||||
```csharp title='MyDbContext.cs'
|
||||
public class MyDbContext : DbContext
|
||||
{
|
||||
public MyDbContext() { }
|
||||
|
||||
public MyDbContext(DbContextOptions<MyDbContext> options)
|
||||
: base(options)
|
||||
{ }
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
if(!optionsBuilder.IsConfigured)
|
||||
{
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Injection d'un ```DbContext``` dans l'application MAUI
|
||||
|
||||
Pour injecter un ```DbContext```, dans la classe ```MauiProgram``` (ou son équivalent), on peut utiliser la méthode d'extension ```AddDbContext```.
|
||||
|
||||
```csharp title='MauiProgram.cs'
|
||||
public static class MauiProgram
|
||||
{
|
||||
const string DatabaseFilename = "MyDatabase.db";
|
||||
|
||||
public static MauiApp CreateMauiApp()
|
||||
{
|
||||
var builder = MauiApp.CreateBuilder();
|
||||
|
||||
//...
|
||||
|
||||
builder.Services.AddDbContext<MyDbContext>(opt => opt.UseSqlite($"Filename={Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename)}"));
|
||||
|
||||
//...
|
||||
|
||||
return builder.Build();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```AddDbContext``` prend en paramètre une ```Action<DbContextOptionsBuilder>``` vous permettant notamment de passer un ```DbContextOptionsBuilder``` construit à la volée.
|
||||
|
||||
```FileSystem.AppDataDirectory``` permet d'atteindre le dossier spécial de données de l'application, quel que soit l'OS.
|
||||
C'est le dossier recommandé pour placer votre base de données, mais vous pouvez choisir un autre emplacement.
|
||||
|
||||
## Consommation dans une page, une VM, ou un autre service
|
||||
Vous pouvez désormais bénéficier de l'injection de dépendances de MAUI pour utiliser votre DbContext, dans une page, dans une VM ou dans un autre service.
|
||||
|
||||
Si on veut par exemple l'utiliser dans la page ```MainPage```, il suffit d'ajouter un membre de type ```MyDbContext``` à ```MainPage```, et de l'injecter via le constructeur.
|
||||
```csharp title='MainPage.xaml.cs'
|
||||
public partial class MainPage : ContentPage
|
||||
{
|
||||
private ArtistsDbContext context;
|
||||
|
||||
public MainPage(ArtistsDbContext context)
|
||||
{
|
||||
//...
|
||||
this.context = context;
|
||||
context.Database.EnsureCreated();
|
||||
InitializeComponent();
|
||||
//...
|
||||
}
|
||||
|
||||
//...
|
||||
}
|
||||
```
|
||||
|
||||
:::caution context.Database.EnsureCreated();
|
||||
Notez l'appel de ```context.Database.EnsureCreated();``` qui permet de garantir l'existence de la base de données avant son utilisation.
|
||||
Si elle n'existe pas, elle est créée lors de l'appel de cette méthode.
|
||||
:::
|
||||
|
||||
:::tip EnsuredCreated() dans la classe ```DbContext```
|
||||
Vous pouvez aussi appeler ```Database.EnsureCreated();``` directement dans le code de votre classe dérivant de ```DbContext``` pour
|
||||
vous éviter d'avoir à le faire dans vos vues ou vos VMs, si vous avez accès à ce code.
|
||||
:::
|
||||
|
||||
On peut ensuite déclarer la page et réaliser l'injection du ```DbContext``` dans la classe ```MauiProgram``` (ou son équivalent) :
|
||||
```csharp title='MauiProgram.cs'
|
||||
builder.Services.AddDbContext<MyDbContext>(opt => opt.UseSqlite($"Filename={Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename)}"))
|
||||
.AddSingleton<MainPage>();
|
||||
```
|
||||
|
||||
On peut aussi récupérer le service à l'aide d'un ```ServiceProvider``` injecté. Par exemple, dans ```MainPage``` (mais réalisable n'importe où) :
|
||||
```csharp title='MainPage.xaml.cs'
|
||||
public partial class MainPage : ContentPage
|
||||
{
|
||||
private readonly IServiceProvider serviceProvider;
|
||||
|
||||
public MainPage(IServiceProvider service)
|
||||
{
|
||||
serviceProvider = service;
|
||||
var ctxt = serviceProvider.GetRequiredService<ArtistsDbContext>();
|
||||
ctxt.Database.EnsureCreated();
|
||||
InitializeComponent();
|
||||
|
||||
//...
|
||||
}
|
||||
//...
|
||||
}
|
||||
```
|
||||
|
||||
À vous d'adapter ce code pour injecter votre ```DbContext``` dans une VM ou un service.
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "6. MAUI & Entity Framework",
|
||||
"position": 6,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Comment utiliser une base de données via Entity Framework dans une application MAUI ?"
|
||||
}
|
||||
}
|
Loading…
Reference in new issue