added ex_042_008_DataSeeding before EF 2.1

EFCore3_Reforged
Marc CHEVALDONNE 6 years ago
parent f679875982
commit 923fcef868

@ -566,9 +566,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_006_Keys_FluentAPI",
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_007_ValueGeneration", "p08_BDD_EntityFramework\ex_042_007_ValueGeneration\ex_042_007_ValueGeneration.csproj", "{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_007_ValueGeneration", "p08_BDD_EntityFramework\ex_042_007_ValueGeneration\ex_042_007_ValueGeneration.csproj", "{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. Initialization Strategy and Seeding Data with CodeFirst", "03. Initialization Strategy and Seeding Data with CodeFirst", "{78374D80-5BE7-425D-BE62-AD8F26491112}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03. Data Seeding", "03. Data Seeding", "{78374D80-5BE7-425D-BE62-AD8F26491112}"
EndProject 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}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_008_DataSeeding_before_EF2.1", "p08_BDD_EntityFramework\ex_042_008_DataSeeding_before_EF2.1\ex_042_008_DataSeeding_before_EF2.1.csproj", "{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -4706,26 +4706,26 @@ Global
{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x64.Build.0 = Release|Any CPU {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x64.Build.0 = Release|Any CPU
{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.ActiveCfg = Release|Any CPU {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.ActiveCfg = Release|Any CPU
{DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.Build.0 = Release|Any CPU {DA7ADAF3-34FF-4B97-8306-EF490A7A713A}.Release|x86.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|Any CPU.Build.0 = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.ActiveCfg = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.Build.0 = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.ActiveCfg = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.Build.0 = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.ActiveCfg = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.Build.0 = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.ActiveCfg = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.Build.0 = Debug|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.ActiveCfg = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.Build.0 = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.ActiveCfg = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.Build.0 = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.ActiveCfg = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.Build.0 = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.ActiveCfg = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.Build.0 = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.ActiveCfg = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x86.Build.0 = Release|Any CPU {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -4995,7 +4995,7 @@ Global
{64EA0021-231A-421F-A616-3973C0106E99} = {5B333C02-67B7-4A4C-AA58-2710C183292B} {64EA0021-231A-421F-A616-3973C0106E99} = {5B333C02-67B7-4A4C-AA58-2710C183292B}
{DA7ADAF3-34FF-4B97-8306-EF490A7A713A} = {5B333C02-67B7-4A4C-AA58-2710C183292B} {DA7ADAF3-34FF-4B97-8306-EF490A7A713A} = {5B333C02-67B7-4A4C-AA58-2710C183292B}
{78374D80-5BE7-425D-BE62-AD8F26491112} = {55E00151-58A6-4E7D-9457-0BB8213B82F5} {78374D80-5BE7-425D-BE62-AD8F26491112} = {55E00151-58A6-4E7D-9457-0BB8213B82F5}
{3C9128AD-B677-460B-A1E1-D5B8B1491157} = {78374D80-5BE7-425D-BE62-AD8F26491112} {26B0F58C-3373-4965-A00A-FB9F9AA2DFC5} = {78374D80-5BE7-425D-BE62-AD8F26491112}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8D31C3AE-36FF-4667-A2A7-0E670245A59E} SolutionGuid = {8D31C3AE-36FF-4667-A2A7-0E670245A59E}

@ -1,5 +1,5 @@
# Entity Framework Core 3.0 # Entity Framework Core 3.0
*06/01/2020 ⋅ Marc Chevaldonné* *13/01/2020 ⋅ Marc Chevaldonné*
--- ---
Entity Framework (EF) Core est un ORM (Object-Relational Mapper) qui permet aux développeurs .NET de gérer de manière simple, légère et extensible, des bases de données. Entity Framework (EF) Core est un ORM (Object-Relational Mapper) qui permet aux développeurs .NET de gérer de manière simple, légère et extensible, des bases de données.
@ -29,6 +29,7 @@ Ce chapitre s'attardera sur le lien entre le mod
* **ex_042_005 : Keys with data annotations** : explique comment créer les clés primaires d'une entité lorsqu'on utilise les *data annotations*. * **ex_042_005 : Keys with data annotations** : explique comment créer les clés primaires d'une entité lorsqu'on utilise les *data annotations*.
* **ex_042_006 : Keys with Fluent API** : explique comment créer les clés primaires d'une entité lorsqu'on utilise la *Fluent API*. * **ex_042_006 : Keys with Fluent API** : explique comment créer les clés primaires d'une entité lorsqu'on utilise la *Fluent API*.
* **ex_042_007 : Value Generation** : explique comment faire générer des valeurs automatiquement lors de l'insertion ou de la mise à jour * **ex_042_007 : Value Generation** : explique comment faire générer des valeurs automatiquement lors de l'insertion ou de la mise à jour
* **ex_042_008 : Data Seeding before Entity Framework 2.1** : explique comment utiliser un stub (méthode qui était recommandée avant EF Core 2.1)
3. *Schemas and migrations* : 3. *Schemas and migrations* :
Le but de ce chapitre sera de vous montrer comment garder votre modèle et votre base de données synchronisés. Le but de ce chapitre sera de vous montrer comment garder votre modèle et votre base de données synchronisés.

@ -0,0 +1,19 @@
using Microsoft.EntityFrameworkCore;
using System;
namespace ex_042_008_DataSeeding_before_EF2_1
{
public static class DataSeeder
{
public static void SeedData(DbContext context)
{
Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 };
Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 };
Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 };
context.AddRange(new Nounours[] { chewie, yoda, ewok });
context.SaveChanges();
}
}
}

@ -0,0 +1,46 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ex_042_008_DataSeeding_before_EF2_1
{
[Table("TableNounours")]
public class Nounours
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UniqueId
{
get; set;
}
[Required]
[MaxLength(256)]
//[Column("name", Order=0, TypeName ="varchar(200)")]
public string Nom
{
get;
set;
}
[Column("Naissance", TypeName = "date")]
public DateTime DateDeNaissance
{
get;
set;
}
[NotMapped]
public int NbPoils
{
get;
set;
}
public override string ToString()
{
return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)";
}
}
}

@ -0,0 +1,14 @@
using Microsoft.EntityFrameworkCore;
namespace ex_042_008_DataSeeding_before_EF2_1
{
class NounoursDBEntities : DbContext
{
public virtual DbSet<Nounours> NounoursSet { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_008_DataSeeding_before_EF2_1.Nounours.mdf;Trusted_Connection=True;");
}
}
}

@ -0,0 +1,50 @@
using Microsoft.Data.SqlClient;
using System;
using System.Linq;
using static System.Console;
namespace ex_042_008_DataSeeding_before_EF2_1
{
class Program
{
static void Main(string[] args)
{
OutputEncoding = System.Text.Encoding.UTF8;
try
{
using (NounoursDBEntities db = new NounoursDBEntities())
{
//Nettoyage
if (db.NounoursSet.Count() > 0)
{
WriteLine("nettoyage de la base car elle n'était pas vide");
foreach (var n in db.NounoursSet)
{
db.NounoursSet.Remove(n);
}
db.SaveChanges();
}
//Seeding
WriteLine("remplissage avec du stub");
DataSeeder.SeedData(db);
WriteLine("Contenu de la base :");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
}
}
catch (SqlException)
{
WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple.");
WriteLine("Pour créer la base de données, suivez les instructions données dans le fichier ReadMe.md associé à cet exemple.");
}
ReadLine();
}
}
}

@ -0,0 +1,115 @@
# ex_042_008_DataSeeding_before_EF2.1
*13/01/2020 &sdot; Marc Chevaldonné*
---
Cet exemple montre comment il était recommandé d'utiliser du Stub avec Entity Framework Core avant la version 2.1.
Il est conseillé d'utiliser une méthode plus moderne (cf. ex_042_009_DataSeeding).
---
## Comment est construit cet exemple ?
* Le projet est de type .NET Core
* Il contient deux classes :
* ```Nounours```
* ```NounoursDBEntities```
* ```DataSeeder```
Le contenu des classes ```Nounours``` et ```NounoursDBEntities``` correspond à ce qui a été vu dans les exemples précédents. Seule la classe ```DataSeeder``` sera donc expliquée ici.
### La classe ```DataSeeder```
* ```DataSeeder``` est une classe statique possédant une méthode ```SeedData``` dont le but est d'ajouter des éléments à la base.
```csharp
using Microsoft.EntityFrameworkCore;
using System;
namespace ex_042_008_DataSeeding_before_EF2_1
{
public static class DataSeeder
{
public static void SeedData(DbContext context)
{
Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 };
Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 };
Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 };
context.AddRange(new Nounours[] { chewie, yoda, ewok });
context.SaveChanges();
}
}
}
```
* Elle est utilisée dans ```Program``` pour remplir la base.
```csharp
using (NounoursDBEntities db = new NounoursDBEntities())
{
//...
DataSeeder.SeedData(db);
//...
}
```
## Comment exécuter cet exemple ?
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*.
* Dans la console que vous venez d'ouvrir, déplacez-vous dans le dossier du projet .NET Core, ici :
```
cd .\p08_BDD_EntityFramework\ex_042_008_DataSeeding_before_EF2_1
```
*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 :
```
dotnet ef migrations add migration_ex_042_008
```
* 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_042_008_DataSeeding_before_EF2.1**.
* Le résultat de l'exécution peut ressembler à :
```
nettoyage de la base car elle n'était pas vide
remplissage avec du stub
Contenu de la base :
9540729e-67d9-442c-63fb-08d798777717: Chewbacca (27/05/1977, 1234567 poils)
df1ce76a-97ee-42c7-63fc-08d798777717: Yoda (21/05/1980, 3 poils)
0b921251-12a6-480a-63fd-08d798777717: Ewok (25/05/1983, 3456789 poils)
```
_Note : les identifiants seront bien sûr différents_
* 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*.
* Pour cela, allez dans le menu *Affichage* puis *Explorateur d'objets SQL Server*.
<img src="../ex_041_001_ConnectionStrings/readmefiles/sqlserver_01.png" width="500"/>
* 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 : *ex_042_008_DataSeeding_before_EF2_1.Nounours.mdf*
* puis *Tables*
* Faites un clic droit sur la table *dbo.Nounours* puis choisissez *Afficher les données*
<img src="../ex_041_001_ConnectionStrings/readmefiles/sqlserver_02.png" width="460"/>
* Vous devriez maintenant pouvoir voir les données suivantes dans le tableau :
|UniqueId |Nom|Naissance
|---|---|---
|9540729e-67d9-442c-63fb-08d798777717|Chewbacca|27/05/1977
|df1ce76a-97ee-42c7-63fc-08d798777717|Yoda|21/05/1980
|0b921251-12a6-480a-63fd-08d798777717|Ewok|25/05/1983
*Notes: les identifiants seront bien sûr différents.*
*Notez l'absence de la colonne "NbPoils"*
*Notez le nom de la colonne "Naissance" et le formatage de la date*

@ -1,8 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<RootNamespace>ex_042_008_DataSeeding_before_EF2_1</RootNamespace>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />

@ -1,53 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : DbContextInitializer.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-17
//
// ========================================================================
using Microsoft.EntityFrameworkCore;
using System;
namespace ex_042_008_InitializationStrategy
{
/// <summary>
/// initialiseur de stratégies...
/// </summary>
public static class DbContextInitializer
{
/// <summary>
/// les différentes stratégies de création de la base
/// </summary>
public enum InitializationStrategies
{
CreateDatabaseIfNotExists,
DropCreateDatabaseIfModelChanges,
DropCreateDatabaseAlways
}
public static void SetInitializer(DbContext context, InitializationStrategies strategy)
{
switch(strategy)
{
//par défaut : crée la base seulement si elle n'existe pas
default:
case InitializationStrategies.CreateDatabaseIfNotExists:
context.Database.EnsureCreated();
break;
//recrée la base même si elle existe déjà
case InitializationStrategies.DropCreateDatabaseAlways:
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
break;
//recrée la base seulement si le modèle change : impossible aujourd'hui en Entity Framework Core...
case InitializationStrategies.DropCreateDatabaseIfModelChanges:
throw new NotImplementedException("Le mode DropCreateDatabaseIfModelChanges ne peut pas encore exister sous Entity Framework Core");
}
}
}
}

@ -1,104 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Nounours.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-17
//
// ========================================================================
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ex_042_008_InitializationStrategy
{
/// <summary>
/// Nounours est une classe POCO, i.e. Plain Old CLR Object.
/// </summary>
[Table("TableNounours")]
public class Nounours
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UniqueId
{
get; set;
}
[Required]
[MaxLength(256)]
public string Nom
{
get;
set;
}
[Column("Naissance")]
public DateTime DateDeNaissance
{
get;
set;
}
[NotMapped]
public int NbPoils
{
get;
set;
}
/// <summary>
/// returns a hash code in order to use this class in hash table
/// </summary>
/// <returns>hash code</returns>
public override int GetHashCode()
{
return Nom.GetHashCode();
}
/// <summary>
/// checks if the "right" object is equal to this Nounours or not
/// </summary>
/// <param name="right">the other object to be compared with this Nounours</param>
/// <returns>true if equals, false if not</returns>
public override bool Equals(object right)
{
//check null
if (object.ReferenceEquals(right, null))
{
return false;
}
if (object.ReferenceEquals(this, right))
{
return true;
}
if (this.GetType() != right.GetType())
{
return false;
}
return this.Equals(right as Nounours);
}
/// <summary>
/// checks if this Nounours is equal to the other Nounours
/// </summary>
/// <param name="other">the other Nounours to be compared with</param>
/// <returns>true if equals</returns>
public bool Equals(Nounours other)
{
return (this.Nom.Equals(other.Nom) && this.DateDeNaissance == other.DateDeNaissance);
}
public override string ToString()
{
return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)";
}
}
}

@ -1,29 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : NounoursDBEntities.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-17
//
// ========================================================================
using Microsoft.EntityFrameworkCore;
namespace ex_042_008_InitializationStrategy
{
/// <summary>
/// La classe qui dérive de DbContext est celle qui permettra de faire les opérations CRUD sur le modèle.
/// Cette classe contient un DbSet<T> pour permettre de réaliser des opérations CRUD sur le type T, ici Nounours.
/// </summary>
class NounoursDBEntities : DbContext
{
public virtual DbSet<Nounours> NounoursSet { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_008_InitializationStrategy.Nounours.mdf;Trusted_Connection=True;");
}
}
}

@ -1,108 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-17
//
// ========================================================================
using System;
using static System.Console;
using System.Linq;
namespace ex_042_008_InitializationStrategy
{
/// <summary>
/// Cet exemple présente les différentes stratégies d'initialisation de la base de données.
///
/// Dans Entity Framework 6 pour .NET Framework (cf. ex_042_004 des exemples .NET Framework), il existe des stratégies d'initialisation.
/// Il n'y a malheureusement pas d'équivalent pour Entity Framework Core.
///
/// Cet exemple reprend le 042_002 tout en proposant une méthode permettant de modifier les stratégies d'initialisation.
/// Pour cela, cet exemple propose l'écriture d'une classe statique DbContextInitializer, mais toutes les stratégies ne sont néanmoins pas reproductibles.
/// </summary>
class Program
{
static void Main(string[] args)
{
OutputEncoding = System.Text.Encoding.UTF8;
Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 };
Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 };
Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 };
Nounours trixi = new Nounours { Nom = "Trixi", DateDeNaissance = new DateTime(2015, 8, 15), NbPoils = 0 };
Nounours Roudoudou = new Nounours { Nom = "Roudoudou", DateDeNaissance = new DateTime(2015, 8, 14), NbPoils = 2000 };
try
{
using (NounoursDBEntities db = new NounoursDBEntities())
{
//choix de la stratégie
DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.CreateDatabaseIfNotExists);
//DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.DropCreateDatabaseAlways);
//DbContextInitializer.SetInitializer(db, DbContextInitializer.InitializationStrategies.DropCreateDatabaseIfModelChanges);
if (db.NounoursSet.Count() > 0)
{
WriteLine("La base n'est pas vide !");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
WriteLine("début du nettoyage...");
}
foreach (var n in db.NounoursSet.ToArray())
{
WriteLine($"Suppression de {n}");
db.NounoursSet.Remove(n);
}
WriteLine("Base avant sauvegarde des changements :");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
db.SaveChanges();
WriteLine("Base après sauvegarde des changements :");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
db.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok, trixi, Roudoudou });
db.SaveChanges();
WriteLine("Base après ajout des 3 nounours et sauvegarde des changements :");
foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n}");
}
}
}
catch(NotImplementedException exception)
{
WriteLine(exception.Message);
}
catch (Exception)
{
WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple.");
WriteLine("Pour créer la base de données, suivez les instructions suivantes (que vous retrouvez en commentaires dans la classe Program) :");
WriteLine("Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,");
WriteLine("- dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),");
WriteLine("- dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_004_EF_CF_InitializationStrategy)");
WriteLine("- tapez : dotnet restore (pour restaurer les packages .NET Core)");
WriteLine("- tapez : dotnet ef migrations add MyFirstMigration");
WriteLine(" note : vous pourrez détruire le dossier Migrations une fois la base créée");
WriteLine("- tapez : dotnet ef database update");
WriteLine(" Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO.");
WriteLine("\nDans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf");
}
ReadLine();
}
}
}

@ -14,7 +14,7 @@
* V 001, 002, 003 entity types, entity properties * V 001, 002, 003 entity types, entity properties
* V 004, 005, 006 keys, 007 generated values * V 004, 005, 006 keys, 007 generated values
* ? backing fields? * ? backing fields?
* initialization strategy, seeding data * 008 seeding data
* shadow properties * shadow properties
* ###### relationships * ###### relationships
* single navigation property * single navigation property

Loading…
Cancel
Save