updated sample ex_041_004 to make it work on MacOSX

EFCore3_Reforged
Marc CHEVALDONNE 5 years ago
parent 8e0008096b
commit 970900c706

@ -570,6 +570,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. Initialization Strategy
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ex_042_008_InitializationStrategy", "p08_BDD_EntityFramework\ex_042_008_InitializationStrategy\ex_042_008_InitializationStrategy.csproj", "{3C9128AD-B677-460B-A1E1-D5B8B1491157}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ex_041_004_ConsoleTests_w_SQLite", "p08_BDD_EntityFramework\ex_041_004_ConsoleTests_w_SQLite\ex_041_004_ConsoleTests_w_SQLite.csproj", "{2249C4B0-563D-44C8-AAA5-C8366A8F509C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -4726,6 +4728,26 @@ Global
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.Build.0 = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|ARM.Build.0 = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|ARM64.Build.0 = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|x64.ActiveCfg = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|x64.Build.0 = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|x86.ActiveCfg = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Debug|x86.Build.0 = Debug|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|Any CPU.Build.0 = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|ARM.ActiveCfg = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|ARM.Build.0 = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|ARM64.ActiveCfg = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|ARM64.Build.0 = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|x64.ActiveCfg = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|x64.Build.0 = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|x86.ActiveCfg = Release|Any CPU
{2249C4B0-563D-44C8-AAA5-C8366A8F509C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -4996,6 +5018,7 @@ Global
{DA7ADAF3-34FF-4B97-8306-EF490A7A713A} = {5B333C02-67B7-4A4C-AA58-2710C183292B}
{78374D80-5BE7-425D-BE62-AD8F26491112} = {55E00151-58A6-4E7D-9457-0BB8213B82F5}
{3C9128AD-B677-460B-A1E1-D5B8B1491157} = {78374D80-5BE7-425D-BE62-AD8F26491112}
{2249C4B0-563D-44C8-AAA5-C8366A8F509C} = {56C5A51B-16E9-4F93-9C32-8F91710391E8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8D31C3AE-36FF-4667-A2A7-0E670245A59E}

@ -1,36 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using ex_041_001_ConnectionStrings;
namespace ex_041_001_ConnectionStrings.Migrations
{
[DbContext(typeof(SQLiteContext))]
[Migration("20200109092359_ex_041_001")]
partial class ex_041_001
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "3.1.0");
modelBuilder.Entity("ex_041_001_ConnectionStrings.Nounours", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Nom")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Nounours");
});
#pragma warning restore 612, 618
}
}
}

@ -1,29 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace ex_041_001_ConnectionStrings.Migrations
{
public partial class ex_041_001 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Nounours",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Nom = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Nounours", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Nounours");
}
}
}

@ -1,34 +0,0 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using ex_041_001_ConnectionStrings;
namespace ex_041_001_ConnectionStrings.Migrations
{
[DbContext(typeof(SQLiteContext))]
partial class SQLiteContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "3.1.0");
modelBuilder.Entity("ex_041_001_ConnectionStrings.Nounours", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Nom")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Nounours");
});
#pragma warning restore 612, 618
}
}
}

@ -0,0 +1,46 @@
using System;
using ex_041_004_TestingInMemory;
using Microsoft.EntityFrameworkCore;
namespace ex_041_004_ConsoleTests_w_SQLite
{
class Program
{
static void Main(string[] args)
{
Nounours chewie = new Nounours { Nom = "Chewbacca" };
Nounours yoda = new Nounours { Nom = "Yoda" };
Nounours ewok = new Nounours { Nom = "Ewok" };
using (var context = new SQLiteNounoursContext())
{
// 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 SQLiteNounoursContext())
{
foreach(var n in context.Nounours)
{
Console.WriteLine($"{n.Id} - {n.Nom}");
}
context.SaveChanges();
}
}
}
public class SQLiteNounoursContext : NounoursContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
if(!options.IsConfigured)
{
options.UseSqlite($"Data Source=ex_041_004_SQLite.Nounours.db");
}
}
}
}

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<StartWorkingDirectory>$(MSBuildProjectDirectory)</StartWorkingDirectory>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ex_041_004_TestingInMemory\ex_041_004_TestingInMemory.csproj" />
</ItemGroup>
</Project>

@ -20,6 +20,15 @@ namespace ex_041_004_ConsoleTests_w_SqlServer
context.Add(ewok);
context.SaveChanges();
}
using (var context = new NounoursContext())
{
foreach(var n in context.Nounours)
{
Console.WriteLine($"{n.Id} - {n.Nom}");
}
context.SaveChanges();
}
}
}
}

@ -1,5 +1,6 @@
# ex_041_004_TestingInMemory
*02/01/2020 &sdot; Marc Chevaldonné*
*02/01/2020 &sdot; Marc Chevaldonné*
*Dernière mise à jour : 09/01/2020 &sdot; Marc Chevaldonné*
---
@ -18,12 +19,14 @@ Pour le reste de l'exemple, celui-ci n'apporte rien de nouveau par rapport à l'
Quatre projets constituent cet exemple :
* **ex_041_004_TestingInMemory** est une bibliothèque de classes .NET Standard contentant le modèle, ie la classe ```Nounours``` et la classe ```NounoursContext```
* **ex_041_004_ConsoleTests_w_SqlServer** est une application console .NET Core qui prouve le fonctionnement "normal" de la base de données (ie comme dans l'exemple ex_041_001) en exploitant la bibliothèque de classes **ex_041_004_TestingInMemory**
* **ex_041_004_ConsoleTests_w_SqlServer** est une application console .NET Core qui prouve le fonctionnement "normal" de la base de données (ie comme dans l'exemple ex_041_001) en exploitant la bibliothèque de classes **ex_041_004_TestingInMemory** (ne fonctionne que sur Windows)
* **ex_041_004_ConsoleTests_w_SQLite** est une application console .NET Core qui prouve le fonctionnement "normal" de la base de données (ie comme dans l'exemple ex_041_001) en exploitant la bibliothèque de classes **ex_041_004_TestingInMemory** (cross-platform)
* **ex_041_004_UnitTests_w_InMemory** est une application de tests unitaires xUnit exploitant le fournisseur **InMemory** et la bibliothèque de classes **ex_041_004_TestingInMemory**
* **ex_041_004_UnitTests_w_SQLiteInMemory** est une application de tests unitaires xUnit exploitant le fournisseur **SQLite in memory** et la bibliothèque de classes **ex_041_004_TestingInMemory**
Vous pouvez donc exécuter cet exemple de trois manières :
* via **ex_041_004_ConsoleTests_w_SqlServer** comme dans l'exemple ex_041_001 avec ```dotnet ef```
Vous pouvez donc exécuter cet exemple de quatre manières :
* via **ex_041_004_ConsoleTests_w_SqlServer** comme dans l'exemple ex_041_001 avec ```dotnet ef``` (seulement sur Windows)
* via **ex_041_004_ConsoleTests_w_SQLite** comme dans l'exemple ex_041_001 avec ```dotnet ef```
* via les tests unitaires de **ex_041_004_UnitTests_w_InMemory**
* via les tests unitaires de **ex_041_004_UnitTests_w_SQLiteInMemory**
@ -80,7 +83,7 @@ public NounoursContext(DbContextOptions<NounoursContext> options)
```
La classe ```NounoursContext``` peut donc s'utiliser comme précédemment, sans changement, et la base *SqlServer* sera utilisée ; ou alors, on pourra injecter un autre fournisseur.
### application console .NET Core ex_041_004_ConsoleTests_w_SqlServer
### application console .NET Core ex_041_004_ConsoleTests_w_SqlServer (seulement pour Windows)
L'application console .NET Core **ex_041_004_ConsoleTests_w_SqlServer** fait référence à la bibliothèque .NET Standard précédente pour pouvoir consommer ```Nounours``` et ```NounoursContext```.
Sa seule classe est donc ```Program``` et peut donc être codée de la manière suivante :
@ -107,6 +110,15 @@ namespace ex_041_004_ConsoleTests_w_SqlServer
context.Add(ewok);
context.SaveChanges();
}
using (var context = new NounoursContext())
{
foreach(var n in context.Nounours)
{
Console.WriteLine($"{n.Id} - {n.Nom}");
}
context.SaveChanges();
}
}
}
}
@ -140,6 +152,9 @@ Vous pouvez maintenant générer et exécuter l'exemple **ex_041_004_ConsoleTest
* Le résultat de l'exécution doit ressembler à :
```
Creates and inserts new Nounours
1 - Chewbacca
2 - Yoda
3 - Ewok
```
* Comment vérifier le contenu des bases de données SQL Server ?
Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'objets SQL Server*.
@ -163,6 +178,102 @@ Vous pouvez vérifier le contenu de votre base en utilisant l'*Explorateur d'obj
|2|Yoda
|3|Ewok
### application console .NET Core ex_041_004_ConsoleTests_w_SQLite
L'application console .NET Core **ex_041_004_ConsoleTests_w_SQLite** fait référence à la bibliothèque .NET Standard précédente pour pouvoir consommer ```Nounours``` et ```SQLiteNounoursContext```.
Ses deux seules classes sont donc ```Program``` et ```SQLiteNounoursContext``` et sont codées de la manière suivante :
```csharp
using System;
using ex_041_004_TestingInMemory;
using Microsoft.EntityFrameworkCore;
namespace ex_041_004_ConsoleTests_w_SQLite
{
class Program
{
static void Main(string[] args)
{
Nounours chewie = new Nounours { Nom = "Chewbacca" };
Nounours yoda = new Nounours { Nom = "Yoda" };
Nounours ewok = new Nounours { Nom = "Ewok" };
using (var context = new SQLiteNounoursContext())
{
// 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();
}
}
}
public class SQLiteNounoursContext : NounoursContext
{
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
if(!options.IsConfigured)
{
options.UseSqlite($"Data Source=ex_041_004_SQLite.Nounours.db");
}
}
}
}
```
La classe ``SQLiteNounoursContext``` a pour but de permettre l'appel de ```dotnet ef``` sans avoir à utiliser le ```NounoursContext``` qui utilise SqlServer. En effet, pour pouvoir
mettre à jour la base SQLite, EFCore demande pour le moment, un ```DbContext``` correspondant à la base à mettre à jour dans la méthode ```OnConfiguring```.
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*.
Ou bien ouvrez le terminal (sous MacOSX)
* Dans la console ou le terminal que vous venez d'ouvrir, déplacez-vous dans le dossier du projet .NET Core, ici :
```
cd .\p08_BDD_EntityFramework\ex_041_004_ConsoleTests_w_SqlServer
```
*Note*:
si vous n'avez pas installé correctement EntityFrameworkCore, il vous faudra peut-être utiliser également :
* ```dotnet tool install --global dotnet-ef``` si vous utilisez la dernière version de .NET Core (3.1 aujourd'hui),
* ```dotnet tool install --global dotnet-ef --version 3.0.0``` si vous vous utiliser spécifiquement .NET Core 3.0.
* Migration : comme la classe dérivant de ```DbContext``` se trouve dans l'application Console, nous n'avons pas à préciser dans quel projet elle se trouve.
```
dotnet ef migrations add migration_ex_041_004
```
* Création de la table :
```
dotnet ef database update
```
* Génération et exécution
Vous pouvez maintenant générer et exécuter l'exemple **ex_041_004_ConsoleTests_w_SQLite**.
* Le résultat de l'exécution doit ressembler à :
```
Creates and inserts new Nounours
1 - Chewbacca
2 - Yoda
3 - Ewok
```
* Comment vérifier le contenu des bases de données SQLite ?
Pour vérifier le contenu de votre base SQLite, vous pouvez utiliser le programme *DB Browser* :
* Rendez-vous sur la page : https://sqlitebrowser.org/dl/ et téléchargez le programme *DB Browser*.
* Lancez *DB Browser for SQLite*
* Glissez-déposez au milieu de la fenêtre de *DB Browser for SQLite* le fichier *ex_041_004_ConsoleTests_w_SQLite.Nounours.db* qui a été généré par l'exécution du programme et qui se trouve près de *ex_041_004_ConsoleTests_w_SQLite.csproj*.
![DB Browser for SQLite](./readmefiles/dbbrowser_01.png)
* Choisissez l'onglet *Parcourir les données*
* Observez les résultats obtenus
![DB Browser for SQLite](./readmefiles/dbbrowser_02.png)
* Vous devriez maintenant pouvoir voir les données suivantes dans le tableau :
|Id |Nom
|---|---
|1|Chewbacca
|2|Yoda
|3|Ewok
### Configuration des tests unitaires avec InMemory
Le test unitaire est de type *xUnit* et va permettre d'injecter le fournisseur **InMemory**.
* On crée un nouveau projet de tests unitaires (*xUnit*)

@ -6,6 +6,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -8,6 +8,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

@ -7,6 +7,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
</ItemGroup>
</Project>

Loading…
Cancel
Save