updated sample about InMemory

EFCore3_Reforged
Marc CHEVALDONNE 6 years ago
parent a54a2676f2
commit eff3011fe3

@ -10,7 +10,7 @@ namespace ex_041_004_InMemory
Nounours yoda = new Nounours { Nom = "Yoda" };
Nounours ewok = new Nounours { Nom = "Ewok" };
using (var context = new SqlServerContext())
using (var context = new NounoursContext())
{
// Crée des nounours et les insère dans la base
Console.WriteLine("Creates and inserts new Nounours");

@ -1,5 +1,41 @@
reprise de l'exemple 041_001 avec seulement SqlServer
nuget, dotnet restore...
# ex_041_004_InMemory
*31/12/2019 ⋅ Marc Chevaldonné*
---
Le fournisseur **InMemory** est utilisé pour tester des bases de données sans avoir à créer réellement une base de données.
Ceci permet de tester les accès à votre "base" de manière toutefois approximative.
En effet, **InMemory** n'est pas une base de données relationnelle : il y a donc des limitations.
Cet exemple montre comment utiliser **InMemory** à travers une injection de dépendance. En d'autres termes, vous continuez à définir votre chaîne de connexion sur une base de données, mais vous permettez néanmoins l'utilisation, à la demande, de **InMemory** pour des tests.
Puisque ce fournisseur devient intéressant dans le cas de tests, j'ai donc ajouté un 2ème projet lié à cet exemple, permettant d'avoir accès à des tests unitaires utilisant **InMemory**.
Pour le reste de l'exemple, celui-ci n'apporte rien de nouveau par rapport à l'exemple ex_041_001.
---
## Comment a été construit cet exemple ?
Cet exemple est tout d'abord construit de la même manière que l'exemple *ex_041_001_ConnectionStrings*.
Il ne faut pas oublier les NuGet nécessaires :
* Microsoft.EntityFrameworkCore : pour le projet en général
* Microsoft.EntityFrameworkCore.SqlServer : pour le *provider* SQL Server
* Microsoft.EntityFrameworkCore.Tools : pour bénéficier des outils de Design, de migrations, etc.
J'ai ensuite décidé de renommer ma classe dérivant de ```DbContext``` en ```NounoursContext``` car je n'ai plus de raison de faire la différence entre SqlServer et SQLite.
On obtient ainsi la classe ```NounoursContext``` suivante :
```csharp
using Microsoft.EntityFrameworkCore;
namespace ex_041_004_InMemory
{
public class NounoursContext : DbContext
{
public DbSet<Nounours> Nounours { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_041_004_InMemory.Nounours.mdf;Trusted_Connection=True;");
}
}
```
modification de OnConfiguring
pour avoir un provider par défaut, mais la possibilité d'en injecter un autre via un constructeur

@ -1,24 +0,0 @@
using Microsoft.EntityFrameworkCore;
namespace ex_041_004_InMemory
{
public class SqlServerContext : DbContext
{
public DbSet<Nounours> Nounours { get; set; }
public SqlServerContext()
{ }
public SqlServerContext(DbContextOptions<SqlServerContext> options)
: base(options)
{ }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
if (!options.IsConfigured)
{
options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_041_004_InMemory.Nounours.mdf;Trusted_Connection=True;");
}
}
}
}

@ -11,12 +11,12 @@ namespace ex_041_004_UnitTests
[Fact]
public void Add_Test()
{
var options = new DbContextOptionsBuilder<SqlServerContext>()
var options = new DbContextOptionsBuilder<NounoursContext>()
.UseInMemoryDatabase(databaseName: "Add_writes_to_database")
.Options;
// Run the test against one instance of the context
using (var context = new SqlServerContext(options))
using (var context = new NounoursContext(options))
{
Nounours chewie = new Nounours { Nom = "Chewbacca" };
Nounours yoda = new Nounours { Nom = "Yoda" };
@ -29,7 +29,7 @@ namespace ex_041_004_UnitTests
}
// Use a separate instance of the context to verify correct data was saved to database
using (var context = new SqlServerContext(options))
using (var context = new NounoursContext(options))
{
Assert.Equal(3, context.Nounours.Count());
Assert.Equal("Chewbacca", context.Nounours.First().Nom);

Loading…
Cancel
Save