added ex_042_008_DataSeeding before EF 2.1

EFCore3_Reforged
Marc CHEVALDONNE 5 years ago
parent f679875982
commit 923fcef868

@ -566,9 +566,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ex_042_006_Keys_FluentAPI",
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}"
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
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
Global
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|x86.ActiveCfg = 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
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|ARM64.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x64.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Debug|x86.Build.0 = Debug|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|Any CPU.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.ActiveCfg = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|ARM64.Build.0 = Release|Any CPU
{3C9128AD-B677-460B-A1E1-D5B8B1491157}.Release|x64.ActiveCfg = Release|Any CPU
{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
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM.Build.0 = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|ARM64.Build.0 = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.ActiveCfg = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x64.Build.0 = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.ActiveCfg = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Debug|x86.Build.0 = Debug|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|Any CPU.Build.0 = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.ActiveCfg = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM.Build.0 = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.ActiveCfg = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|ARM64.Build.0 = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.ActiveCfg = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x64.Build.0 = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.ActiveCfg = Release|Any CPU
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -4995,7 +4995,7 @@ Global
{64EA0021-231A-421F-A616-3973C0106E99} = {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}
{3C9128AD-B677-460B-A1E1-D5B8B1491157} = {78374D80-5BE7-425D-BE62-AD8F26491112}
{26B0F58C-3373-4965-A00A-FB9F9AA2DFC5} = {78374D80-5BE7-425D-BE62-AD8F26491112}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8D31C3AE-36FF-4667-A2A7-0E670245A59E}

@ -1,5 +1,5 @@
# 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.
@ -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_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_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* :
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>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<RootNamespace>ex_042_008_DataSeeding_before_EF2_1</RootNamespace>
</PropertyGroup>
<ItemGroup>
<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 004, 005, 006 keys, 007 generated values
* ? backing fields?
* initialization strategy, seeding data
* 008 seeding data
* shadow properties
* ###### relationships
* single navigation property

Loading…
Cancel
Save