cleaning old samples

EFCore3_Reforged
Marc CHEVALDONNE 6 years ago
parent b2be83a446
commit 9a1d01e179

@ -1,103 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Nounours.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
namespace ex_042_001_EF_CodeFirst_conventions
{
/// <summary>
/// Nounours est une classe POCO, i.e. Plain Old CLR Object.
/// Elle contient 3 propriétés en lecture/écriture : Nom, DateDeNaissance et NbPoils. Nous parlerons de la 4ème (ID) dans un moment.
/// Entity Framework va utiliser la classe POCO Nounours pour créer une table dans la base de données, lorsque le DbSet va être créé (nous verrons ça dans la classe NounoursDBEntities).
///
/// L'utilisation des conventions d'écriture d'Entity Framework font que la table qui va être créée aura :
/// - un nom correspondant au nom de la classe POCO : ici "Nounours"
/// - une colonne pour chaque propriété publique : ici, "Nom", "DateDeNaissance" et "NbPoils"
///
/// De plus, en rajoutant une propriété de type int et avec le nom "ID", Entity Framework ajoute directement une colonne "ID" et l'utilise comme clé primaire.
/// </summary>
public class Nounours
{
public int ID
{
get; set;
}
public string Nom
{
get;
set;
}
public DateTime DateDeNaissance
{
get;
set;
}
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 $"{ID}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)";
}
}
}

@ -1,36 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : NounoursDBEntities.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using Microsoft.EntityFrameworkCore;
namespace ex_042_001_EF_CodeFirst_conventions
{
/// <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.
///
/// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé
/// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici
/// dans App.config.
/// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants.
/// </summary>
class NounoursDBEntities : DbContext
{
public virtual DbSet<Nounours> NounoursSet { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Initial Catalog=ex_042_001_EF_CodeFirst_conventions;Integrated Security=SSPI;AttachDBFileName=|DataDirectory|\ex_042_001_EF_CodeFirst_conventions.mdf");
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_001_EF_CodeFirst_conventions.Nounours.mdf;Trusted_Connection=True;");
}
}
}

@ -1,124 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
using System.Linq;
using static System.Console;
namespace ex_042_001_EF_CodeFirst_conventions
{
/// <summary>
/// Ce premier exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement
/// une base à partir de vos classes métier, en profitant des conventions de nommage d'Entity Framework.
///
/// Contrairement à EntityFramework 6 dans le .NET framework 4.6, il y a un "petit peu" plus de travail à fournir, mais pas des masses... :)
/// Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,
/// - dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),
/// - dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions)
/// - tapez : dotnet restore (pour restaurer les packages .NET Core)
/// - tapez : dotnet ef migrations add MyFirstMigration
/// note : vous pourrez détruire le dossier Migrations une fois la base créée
/// - tapez : dotnet ef database update
/// Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO.
/// Dans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf
///
/// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities.
/// 1/ Nounours -> voir commentaires dans la classe Nounours
/// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities
///
/// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée).
/// Celle-ci donne accès à la DbSet<Nounours> à laquelle nous rajoutons 3 Nounours.
/// Mais avant cela, nous vérifions qu'ils n'existent pas déjà en base, et si c'est le cas, nous les détruisons.
///
/// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges.
///
///
/// Pour visualiser les résultats, vous pouvez :
/// - aller dans Affichage -> Explorateur d'objets SQL Server
/// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données
/// -> ex_042_001_EF_CodeFirst_conventions -> Tables -> dbo.Nounours
/// en cliquant sur dbo.Nounours vous pourrez voir la table
/// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table
///
/// </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())
{
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 (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_001_EF_CodeFirst_conventions)");
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();
}
}
}

@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>ex_042_001_EF_CodeFirst_conventions</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>ex_042_001_EF_CodeFirst_conventions</PackageId>
<RuntimeFrameworkVersion>3.0.1</RuntimeFrameworkVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -1,119 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Nounours.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ex_042_002_EF_CodeFirst_data_annotations
{
/// <summary>
/// Nounours est une classe POCO, i.e. Plain Old CLR Object.
/// Nous avons vu dans l'exemple précédent comment utiliser les conventions d'écriture. Cette méthode est pratique mais ne nous laisse pas beaucoup
/// de possibilités de modifier la table selon nos désirs.
/// Cet exemple montre comment utiliser les data annotations. En voici quelques exemples principaux :
/// - la classe utilise l'annotation [Table("TableNounours")] qui permet de modifier le nom de la table dans la base de données
/// - la propriété DateDeNaissance a une annotation "Column" permettant de choisir un nom pour la colonne
/// - la propriété Nom n'a pas d'annotation "Column", c'est donc la convention d'écriture qui s'applique pour le nom de la colonne => "Nom"
/// - la propriété Nom a une annotation "Required" qui indique que le champ est obligatoire
/// - la propriété Nom a une annotation MaxLength indiquant combien de caractères peut avoir le Nom au maximum dans la base de données
/// - la propriété NbPoils a une annotation NotMapped indiquant qu'il n'y aura pas de colonne associée à cette propriété dans la table
/// - la propriété UniqueId a une annotation Key pour indiquer que c'est cette propriété qu'il faut utiliser comme clé primaire
/// - la propriété UniqueId a également une annotation DatabaseGenerated permettant d'indiquer que c'est lors de l'insertion dans la table qu'une
/// clé primaire (ici de type Guid, et pas obligatoirement int) lui sera attribuée
///
/// Il existe d'autres annotations que vous pouvez découvrir et utiliser par la suite comme ForeignKey, TimeStamp, ConcurrencyCheck, CreditCard,
/// EmailAddress, Phone, StringLength, Url...
/// </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,34 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : NounoursDBEntities.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-12
//
// ========================================================================
using Microsoft.EntityFrameworkCore;
namespace ex_042_002_EF_CodeFirst_data_annotations
{
/// <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.
///
/// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé
/// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici
/// dans App.config.
/// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants.
/// </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_002_EF_CodeFirst_data_annotations.Nounours.mdf;Trusted_Connection=True;");
}
}
}

@ -1,124 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
using static System.Console;
using System.Linq;
namespace ex_042_002_EF_CodeFirst_data_annotations
{
/// <summary>
/// Ce deuxième exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement
/// une base à partir de vos classes métier, en profitant des data annotations d'Entity Framework.
///
/// Seule la classe Nounours est différente. Tout le reste de l'exemple est le même que le précédent.
///
/// Contrairement à EntityFramework 6 dans le .NET framework 4.6, il y a un "petit peu" plus de travail à fournir, mais pas des masses... :)
/// Pour créer la base, ouvrez un invite de commandes et placez-vous dans le dossier de ce projet, ou bien,
/// - dans Visual Studio ouvrez la Console du Gestionnaire de package (Outils -> Gestionnaire de package NuGet -> Console du Gestionnaire de package),
/// - dans cette Console, vous devriez être dans le dossier de la solution, déplacez-vous dans celui du projet (ici : cd ex_042_001_EF_CodeFirst_conventions)
/// - tapez : dotnet restore (pour restaurer les packages .NET Core)
/// - tapez : dotnet ef migrations add MyFirstMigration
/// note : vous pourrez détruire le dossier Migrations une fois la base créée
/// - tapez : dotnet ef database update
/// Ceci génère la base de données en utilisant la migration, et en particulier votre classe DBContext et vos classes POCO.
/// Dans cet exemple, une base de données SQLServer est créée et en particulier la table Nounours.mdf
///
///
/// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities.
/// 1/ Nounours -> voir commentaires dans la classe Nounours
/// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities
///
/// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée).
/// Celle-ci donne accès à la DbSet<Nounours> à laquelle nous rajoutons 3 Nounours.
///
/// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges.
///
/// Pour visualiser les résultats, vous pouvez :
/// - aller dans Affichage -> Explorateur d'objets SQL Server
/// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données
/// -> ex_042_002_EF_CodeFirst_data_annotations -> Tables -> dbo.TableNounours
/// en cliquant sur dbo.TableNounours vous pourrez voir la table
/// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table
/// </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())
{
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 (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_002_EF_CodeFirst_data_annotations)");
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();
}
}
}

@ -1,24 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>ex_042_002_EF_CodeFirst_data_annotations</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>ex_042_002_EF_CodeFirst_data_annotations</PackageId>
<RuntimeFrameworkVersion>3.0.1</RuntimeFrameworkVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -1,100 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Nounours.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
namespace ex_042_003_EF_CodeFirst_Fluent_API
{
/// <summary>
/// Nounours est une classe POCO, i.e. Plain Old CLR Object.
/// Elle contient 4 propriétés en lecture/écriture : Nom, DateDeNaissance, NbPoils et UniqueId.
/// Entity Framework va utiliser la classe POCO Nounours pour créer une table dans la base de données, lorsque le DbSet va être créé (nous verrons ça dans la classe NounoursDBEntities).
///
/// Dans cet exemple, nous n'utilisons pas les annotations de données (data annotations) et nous n'utiliserons pas non plus implicitement les conventions d'écriture
/// d'Entity Framework car nous allons les réécrire dans la classe NounoursDBEntities.
/// </summary>
public class Nounours
{
public Guid UniqueId
{
get; set;
}
public string Nom
{
get;
set;
}
public DateTime DateDeNaissance
{
get;
set;
}
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,86 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : NounoursDBEntities.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-12
//
// ========================================================================
using Microsoft.EntityFrameworkCore;
namespace ex_042_003_EF_CodeFirst_Fluent_API
{
/// <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.
///
/// Lorsque nous utiliserons cette classe, le programme cherchera la chaîne de connection (connectionString) avec le même nom que celui passé
/// dans le constructeur de DbContext (ici NounoursDBContext). Il cherche la connectionString à différents endroits et en particulier ici
/// dans App.config.
/// Si cette table n'existe pas, il va la créer automatiquement. Ceci est configurable et sera présenté dans les exemples suivants.
///
/// Contrairement aux 2 exemples précédents, nous n'utilisons pas les conventions d'écriture, ni les annotations de données pour utiliser créer la table
/// à partir de la classe Nounours. Nous allons cette fois-ci utiliser la Fluent API et réécrire dans la classe NounoursDBEntities dérivant de DbContext
/// de quelle manière créer la table à partir de la classe Nounours.
///
/// Cette méthode est préférable dans les deux cas principaux suivants (et en particulier le 1er) :
/// - nous n'avons pas accès au code source de la classe Nounours ou bien nous n'avons pas le droit de le modifier, et les conventions d'écriture ne
/// correspondent pas à ce que nous souhaitons réaliser.
/// - nous ne souhaitons pas "polluer" la classe POCO avec des annotations de données.
///
/// L'inconvénient majeur et évident de cette méthode est que la lecture et la maintenance sont plus compliquées.
///
/// Pour utiliser la Fluent API et décrire de quelle manière créer la table à partir de la classe POCO, il faut réécrire la méthode virtuelle OnModelCreating
/// (cf. commentaires de la méthode ci-dessous).
///
/// L'exemple ci-dessous recrée exactement la même table que dans l'exemple précédent.
/// </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_003_EF_CodeFirst_Fluent_API.Nounours.mdf;Trusted_Connection=True;");
}
/// <summary>
/// méthode appelée lors de la création du modèle.
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//ici on précise comment s'appellera la table associée à la classe POCO Nounours
//équivalent du [Table("TableNounours")] avec les annotations de données
modelBuilder.Entity<Nounours>().ToTable("TableNounours");
//ici on précise que la propriété UniqueId de Nounours est la clef primaire
//équivalent de [Key] devant la propriété UniqueId dans Nounours
modelBuilder.Entity<Nounours>().HasKey(n => n.UniqueId);
//ici on explique que c'est lors de l'insertion en base que la clef primaire sera générée
//équivalent de [DatabaseGenerated(DatabaseGeneratedOption.Identity)] devant la propriété UniqueId de Nounours
modelBuilder.Entity<Nounours>().Property(n => n.UniqueId).ValueGeneratedOnAdd();
//HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
//ici on précise que la propriété Nom est obligatoire et que sa taille maximale est de 256 caractères
//Notez l'utilisation des méthodes chaînées ! Trop beau ! Tellement pratique, intuitif et évident...
//équivalent de [Required] et [MaxLength(256)] devant la propriété Nom de Nounours
modelBuilder.Entity<Nounours>().Property(n => n.Nom).IsRequired()
.HasMaxLength(256);
//ici on donne un nom à la colonne associée à la propriété DateDeNaissance
//équivalent de [Column("Naissance")] devant la propriété DateDeNaissance de Nounours
modelBuilder.Entity<Nounours>().Property(n => n.DateDeNaissance).HasColumnName("Naissance");
//ici on précise que la propriété NbPoils ne sera pas insérée en base
//équivalent de [NotMapped] devant la propriété NbPoils de Nounours
modelBuilder.Entity<Nounours>().Ignore(n => n.NbPoils);
base.OnModelCreating(modelBuilder);
}
}
}

@ -1,119 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-16
//
// ========================================================================
using System;
using static System.Console;
using System.Linq;
namespace ex_042_003_EF_CodeFirst_Fluent_API
{
/// <summary>
/// Ce troisième exemple utilisant l'approche CodeFirst avec EntityFramework montre comment vous pouvez créer simplement
/// une base à partir de vos classes métier, en profitant de l'API Fluent d'Entity Framework.
///
/// Ici, nous n'expliquerons pas comment utiliser la chaîne de connection ; référez-vous aux exemples suivants pour plus d'informations.
/// Elle est définie dans le fichier App.config avec le nom NounoursDBContext.
///
/// Nous allons nous attarder sur la classe Nounours et NounoursDBEntities.
/// 1/ Nounours -> voir commentaires dans la classe Nounours
/// 2/ NounoursDBEntities -> voir commentaires dans la classe NounoursDBEntities
/// C'est cette classe NounoursDBEntities qui explique comment traduire Nounours en Table.
///
/// Ensuite, nous pouvons donc instancier NounoursDBEntities (à l'aide d'un bloc using car il s'agit d'une ressource non managée).
/// Celle-ci donne accès à la DbSet<Nounours> à laquelle nous rajoutons 3 Nounours.
///
/// Ces modifications sont persistées dans la base lors de l'appel à SaveChanges.
///
/// Pour visualiser les résultats, vous pouvez :
/// - aller dans Affichage -> Explorateur d'objets SQL Server
/// - dans cet explorateur, SQL Server -> (localdb)\MSSQLLocalDB... -> Bases de données
/// -> ex_042_003_EF_CodeFirst_Fluent_API -> Tables -> dbo.TableNounours
/// en cliquant sur dbo.TableNounours vous pourrez voir la table
/// avec un clic droit -> "Afficher les données" sur dbo.Nounours vous pourrez voir les données dans la table
///
/// Si vous exécutez une deuxième fois le projet après avoir modifié la classe Nounours, celui-ci ne marchera pas
/// car la table créée n'aura plus les bonnes caractéristiques correspondant à la classe Nounours.
/// Vous pouvez pour cela effacer la base, avec un clic droit sur ex_042_003_EF_CodeFirst_Fluent_API -> Supprimer
/// puis relancer le programme.
/// </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())
{
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 (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_003_EF_CodeFirst_Fluent_API)");
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();
}
}
}

@ -1,24 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>ex_042_003_EF_CodeFirst_Fluent_API</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>ex_042_003_EF_CodeFirst_Fluent_API</PackageId>
<RuntimeFrameworkVersion>3.0.1</RuntimeFrameworkVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -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_004_EF_CF_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_004_EF_CF_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_004_EF_CF_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_004_EF_CF_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_004_EF_CF_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();
}
}
}

@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>ex_042_004_EF_CF_InitializationStrategy</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>ex_042_004_EF_CF_InitializationStrategy</PackageId>
<RuntimeFrameworkVersion>3.0.1</RuntimeFrameworkVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

@ -1,70 +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_005_EF_CF_Seeding_Data
{
/// <summary>
/// initialiseur de stratégies...
/// </summary>
public static class DbContextInitializer
{
/// <summary>
/// remplissage de la base avec des données stubbées.
/// </summary>
/// <param name="context">base à remplir</param>
public static void Seed(NounoursDBEntities context)
{
SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways);
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.NounoursSet.AddRange(new Nounours[] { chewie, yoda, ewok });
context.SaveChanges();
}
/// <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_005_EF_CF_Seeding_Data
{
/// <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_005_EF_CF_Seeding_Data
{
/// <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>
public class NounoursDBEntities : DbContext
{
public virtual DbSet<Nounours> NounoursSet { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=ex_042_005_EF_CF_Seeding_Data.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_005_EF_CF_Seeding_Data
{
/// <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.
///
/// De plus, elle montre comment injecter des données stubbées pour permettre de rapidement tester la base.
/// </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 et remplissage avec des données stubbées
DbContextInitializer.Seed(db);
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_005_EF_CF_Seeding_Data)");
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();
}
}
}

@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AssemblyName>ex_042_005_EF_CF_Seeding_Data</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>ex_042_005_EF_CF_Seeding_Data</PackageId>
<RuntimeFrameworkVersion>3.0.1</RuntimeFrameworkVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
Loading…
Cancel
Save