temp on ex_042_012_EF_CF_Dictionary

updatesEFSamplesToNetCore3
Marc CHEVALDONNE 6 years ago
parent 93d98a330d
commit 65edc7fa4e

@ -28,31 +28,31 @@ namespace ex_042_012_EF_CF_Dictionary
{ {
SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways); SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways);
Nounours[] lesNounours; NounoursEntity[] lesNounours;
Lit[] lesLits; LitEntity[] lesLits;
List<Score> lesScores = new List<Score>(); List<Score> lesScores = new List<Score>();
//données stubbées //données stubbées
//simulation de données en utilisant les types du Model //simulation de données en utilisant les types du Model
Nounours chewie = new Nounours { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; NounoursEntity chewie = new NounoursEntity { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 };
Nounours yoda = new Nounours { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; NounoursEntity yoda = new NounoursEntity { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 };
Nounours ewok = new Nounours { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; NounoursEntity ewok = new NounoursEntity { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 };
Nounours beluga = new Nounours { Nom = "Beluga", DateDeNaissance = new DateTime(2012, 07, 29), NbPoils = 0 }; NounoursEntity beluga = new NounoursEntity { Nom = "Beluga", DateDeNaissance = new DateTime(2012, 07, 29), NbPoils = 0 };
Nounours singe = new Nounours { Nom = "Singe", DateDeNaissance = new DateTime(2009, 08, 09), NbPoils = 1345 }; NounoursEntity singe = new NounoursEntity { Nom = "Singe", DateDeNaissance = new DateTime(2009, 08, 09), NbPoils = 1345 };
Nounours girafe = new Nounours { Nom = "Girafe", DateDeNaissance = new DateTime(2007, 11, 02), NbPoils = 567 }; NounoursEntity girafe = new NounoursEntity { Nom = "Girafe", DateDeNaissance = new DateTime(2007, 11, 02), NbPoils = 567 };
lesNounours = new Nounours[] { chewie, yoda, ewok, beluga, singe, girafe }; lesNounours = new NounoursEntity[] { chewie, yoda, ewok, beluga, singe, girafe };
Lit litDeLuke = new Lit() { Propriétaire = "Luke" }; LitEntity litDeLuke = new LitEntity() { Propriétaire = "Luke" };
litDeLuke[chewie] = 100; litDeLuke[chewie] = 100;
litDeLuke[yoda] = 200; litDeLuke[yoda] = 200;
litDeLuke[ewok] = 1; litDeLuke[ewok] = 1;
Lit monLit = new Lit() { Propriétaire = "Moi" }; LitEntity monLit = new LitEntity() { Propriétaire = "Moi" };
monLit[beluga] = 10; monLit[beluga] = 10;
monLit[singe] = 100; monLit[singe] = 100;
monLit[girafe] = 1000; monLit[girafe] = 1000;
lesLits = new Lit[] { litDeLuke, monLit }; lesLits = new LitEntity[] { litDeLuke, monLit };
//***************** //*****************

@ -1,105 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : LitEx.cs
// Author : Marc Chevaldonné
// Creation date : 2016-11-01
//
// ========================================================================
using ex_042_012_EF_CF_Dictionary.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
namespace ex_042_012_EF_CF_Dictionary
{
/// <summary>
/// espèce de procurateur qui enveloppe un Lit afin de permettre son lien avec Entity Framework malgré le dictionnaire
/// </summary>
[Table("Lits")]
public class LitEx : ILit
{
/// <summary>
/// l'objet Lit wrappé (n'est pas enregistré en base)
/// </summary>
[NotMapped]
public Lit Lit
{
get; set;
}
/// <summary>
/// wrapper sur la propriété UniqueId du Lit
/// généré lors de l'insertion en base
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid UniqueId
{
get { return Lit.UniqueId; }
set { Lit.UniqueId = value; }
}
/// <summary>
/// wrapper de la propriété Propriétaire du Lit
/// </summary>
public string Propriétaire
{
get { return Lit.Propriétaire; }
set { Lit.Propriétaire = value; }
}
/// <summary>
/// remplace le dictionnaire : on utilise une collection de Scores afin d'établir une relation one to many entre
/// LitEx et Score
/// </summary>
public virtual ICollection<Score> Scores
{
get;
set;
} = new List<Score>();
ReadOnlyDictionary<INounours, int> ILit.Scores => throw new NotImplementedException();
public int this[INounours nounours]
{
get
{
var score = Scores.SingleOrDefault(sc => sc.Key.UniqueId == nounours.UniqueId);
return score != null ? score.Value : 0;
}
set
{
var score = Scores.SingleOrDefault(sc => sc.Key.UniqueId == nounours.UniqueId);
if(score != null)
{
score.Value = value;
}
else
{
NounoursEx nEx = new NounoursEx(nounours);
Score newScore = new Score()
{
Key = nEx,
Value = value,
Lit = this
};
Scores.Add(newScore);
}
}
}
public LitEx()
{
Lit = new Lit();
}
private static INounoursEqualityComparer NounoursEqComparer { get; set; } = new INounoursEqualityComparer();
}
}

@ -14,8 +14,8 @@ namespace ex_042_012_EF_CF_Dictionary
/// </summary> /// </summary>
public class NounoursDBEntities : DbContext public class NounoursDBEntities : DbContext
{ {
public virtual DbSet<NounoursEx> NounoursSet { get; set; } public virtual DbSet<NounoursEntity> NounoursSet { get; set; }
public virtual DbSet<LitEx> LitsSet { get; set; } public virtual DbSet<LitEntity> LitsSet { get; set; }
public virtual DbSet<Score> ScoresSet { get; set; } public virtual DbSet<Score> ScoresSet { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
@ -27,42 +27,42 @@ namespace ex_042_012_EF_CF_Dictionary
/// méthode appelée lors de la création du modèle. /// méthode appelée lors de la création du modèle.
/// </summary> /// </summary>
/// <param name="modelBuilder"></param> /// <param name="modelBuilder"></param>
//protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)
//{ {
// //création de la table TableNounours //création de la table TableNounours
// modelBuilder.Entity<Nounours>().ToTable("Nounours"); //nom de la table modelBuilder.Entity<NounoursEntity>().ToTable("Nounours"); //nom de la table
// modelBuilder.Entity<Nounours>().HasKey(n => n.UniqueId); //définition de la clé primaire modelBuilder.Entity<NounoursEntity>().HasKey(n => n.UniqueId); //définition de la clé primaire
// modelBuilder.Entity<Nounours>().Property(n => n.UniqueId); modelBuilder.Entity<NounoursEntity>().Property(n => n.UniqueId);
// modelBuilder.Entity<Nounours>().Property(n => n.Nom).IsRequired() modelBuilder.Entity<NounoursEntity>().Property(n => n.Nom).IsRequired()
// .HasMaxLength(256); //définition de la colonne Nom .HasMaxLength(256); //définition de la colonne Nom
// modelBuilder.Entity<Nounours>().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); //changement du nom de la colonne Naissance modelBuilder.Entity<NounoursEntity>().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); //changement du nom de la colonne Naissance
// modelBuilder.Entity<Nounours>().Property<Guid>("ForeignKey"); //modelBuilder.Entity<NounoursEntity>().Property<Guid>("ForeignKey");
// modelBuilder.Entity<Nounours>().Property<Score>("Score"); //modelBuilder.Entity<Nounours>().Property<Score>("Score");
// //note : la colonne NbPoils n'est pas changée : utilisation des conventions EF //note : la colonne NbPoils n'est pas changée : utilisation des conventions EF
// //création de la table "Lits" // //création de la table "Lits"
// modelBuilder.Entity<Lit>().ToTable("Lits"); // nom de la table // modelBuilder.Entity<Lit>().ToTable("Lits"); // nom de la table
// modelBuilder.Entity<Lit>().HasKey(c => c.UniqueId); //définition de la clé primaire // modelBuilder.Entity<Lit>().HasKey(c => c.UniqueId); //définition de la clé primaire
// modelBuilder.Entity<Lit>().Property(c => c.UniqueId) // modelBuilder.Entity<Lit>().Property(c => c.UniqueId)
// .ValueGeneratedOnAdd(); // .ValueGeneratedOnAdd();
// modelBuilder.Entity<Lit>().Property<IEnumerable<Score>>("ScoresList"); // modelBuilder.Entity<Lit>().Property<IEnumerable<Score>>("ScoresList");
// //note : la colonne LastModified n'est pas touchée : utilisation des conventions EF // //note : la colonne LastModified n'est pas touchée : utilisation des conventions EF
// //on précise qu'il y a une relation entre Score et Nounours //on précise qu'il y a une relation entre Score et Nounours
// modelBuilder.Entity<Score>() //l'entité Nounours... modelBuilder.Entity<Score>() //l'entité Nounours...
// .HasOne("Nounours") //a une propriété obligatoire Carnet... .HasOne(s => s.Key) //a une propriété obligatoire Carnet...
// .WithOne("Score") //reliée à la propriété Owner du Carnet... .WithOne(ne => ne.Score) //reliée à la propriété Owner du Carnet...
// .HasForeignKey("Nounours", "ForeignKey");//dont la propriété UniqueId est une Foreign Key .HasForeignKey<NounoursEntity>(ne => ne.UniqueId);//dont la propriété UniqueId est une Foreign Key
// //remplace la ForeignKey //remplace la ForeignKey
// modelBuilder.Entity<Lit>() modelBuilder.Entity<LitEntity>()
// .HasMany("ScoresList") .HasMany("mScores")
// .WithOne("Lit") .WithOne("Lit")
// .HasForeignKey("UniqueId"); .HasForeignKey("UniqueId");
// base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
//} }
/// <summary> /// <summary>
/// permet de récupérer les données rentrées en base en les projetant dans les types utilisés pour le Model. /// permet de récupérer les données rentrées en base en les projetant dans les types utilisés pour le Model.
@ -70,39 +70,39 @@ namespace ex_042_012_EF_CF_Dictionary
/// <param name="lits">les lits rentrés en base</param> /// <param name="lits">les lits rentrés en base</param>
/// <param name="nounours">les nounours rentrés en base</param> /// <param name="nounours">les nounours rentrés en base</param>
/// <returns>true si la récupération est réussie, false sinon</returns> /// <returns>true si la récupération est réussie, false sinon</returns>
public bool GetAll(out IEnumerable<Lit> lits, out IEnumerable<INounours> nounours) //public bool GetAll(out IEnumerable<ILit> lits, out IEnumerable<INounours> nounours)
{ //{
try // try
{ // {
// récupère la collection de NounoursEx contenus dans la base et les projette en collection de Nounours // // récupère la collection de NounoursEx contenus dans la base et les projette en collection de Nounours
nounours = NounoursSet.ToList();//.Select(nEx => nEx.Nounours); // nounours = NounoursSet.ToList();//.Select(nEx => nEx.Nounours);
//récupère la collection de LitEx contenus dans la base et les projette en collection de Lit // //récupère la collection de LitEx contenus dans la base et les projette en collection de Lit
lits = LitsSet.ToList().Select(lEx => lEx.Lit); // lits = LitsSet.ToList();
//parcourt la collection des scores contenus en base... // //parcourt la collection des scores contenus en base...
foreach (Score score in ScoresSet) // foreach (Score score in ScoresSet)
{ // {
//...pour chaque score ... // //...pour chaque score ...
//... trouve le lit concerné par ce score... // //... trouve le lit concerné par ce score...
Lit leLit = lits.Single(l => l.Propriétaire == score.Lit.Propriétaire); // ILit leLit = lits.Single(l => l.Propriétaire == score.Lit.Propriétaire);
//...trouve le nounours concerné par ce score... // //...trouve le nounours concerné par ce score...
INounours leNounours = nounours.Single(n => n.Equals(score.Key)); // INounours leNounours = nounours.Single(n => n.Equals(score.Key));
//... met à jour le dictionnaire dans l'instance de Lit // //... met à jour le dictionnaire dans l'instance de Lit
leLit[leNounours] = score.Value; // leLit[leNounours] = score.Value;
} // }
return true; // return true;
} // }
catch (Exception e) // catch (Exception e)
{ // {
Debug.WriteLine(e.Message); // Debug.WriteLine(e.Message);
lits = null; // lits = null;
nounours = null; // nounours = null;
return false; // return false;
} // }
} //}
NounoursEx[] lesNounoursEx; //INounours[] lesNounours;
LitEx[] lesLitsEx; //ILit[] lesLits;
List<Score> lesScores = new List<Score>(); List<Score> lesScores = new List<Score>();
/// <summary> /// <summary>
@ -111,47 +111,47 @@ namespace ex_042_012_EF_CF_Dictionary
/// </summary> /// </summary>
/// <param name="lesLits"></param> /// <param name="lesLits"></param>
/// <param name="lesNounours"></param> /// <param name="lesNounours"></param>
public void AddAll(IEnumerable<Lit> lesLits, IEnumerable<Nounours> lesNounours) public void AddAll(IEnumerable<LitEntity> lesLits, IEnumerable<NounoursEntity> lesNounours)
{ {
//projection des données dans les types NounoursEx, LitEx et Scores pour permettre d'utiliser EntityFramework pour l'insertion en base // //projection des données dans les types NounoursEx, LitEx et Scores pour permettre d'utiliser EntityFramework pour l'insertion en base
lesNounoursEx = lesNounours.Select(n => new NounoursEx(n)).ToArray(); // //lesNounoursEx = lesNounours.Select(n => new NounoursEx(n)).ToArray();
lesLitsEx = lesLits.Select(l => new LitEx { Lit = l }).ToArray(); // //lesLitsEx = lesLits.Select(l => new LitEx { Lit = l }).ToArray();
//met à jour la collection de scores // //met à jour la collection de scores
foreach (var litEx in lesLitsEx) // foreach (var litEx in lesLitsEx)
{ // {
UpdateScores(litEx); // UpdateScores(litEx);
} // }
//met à jour les tables //met à jour les tables
NounoursSet.AddRange(lesNounoursEx); NounoursSet.AddRange(lesNounours);
LitsSet.AddRange(lesLitsEx); LitsSet.AddRange(lesLits);
ScoresSet.AddRange(lesScores); ScoresSet.AddRange(lesScores);
SaveChanges(); SaveChanges();
} }
private INounoursEqualityComparer NounoursEqComparer { get; set; } = new INounoursEqualityComparer(); //private INounoursEqualityComparer NounoursEqComparer { get; set; } = new INounoursEqualityComparer();
/// <summary> /// <summary>
/// transforme les dictionnaires en collection de scores /// transforme les dictionnaires en collection de scores
/// </summary> /// </summary>
/// <param name="litEx"></param> /// <param name="lit"></param>
private void UpdateScores(LitEx litEx) //private void UpdateScores(ILit lit)
{ //{
foreach (var kvp in litEx.Lit.Scores) // foreach (var kvp in lit.Scores)
{ // {
NounoursEx nounoursEx = lesNounoursEx.Single(nEx => NounoursEqComparer.Equals(nEx, kvp.Key)); // NounoursEx nounoursEx = lesNounoursEx.Single(nEx => NounoursEqComparer.Equals(nEx, kvp.Key));
Score score = new Score() // Score score = new Score()
{ // {
Key = nounoursEx, // Key = nounoursEx,
Value = kvp.Value, // Value = kvp.Value,
Lit = litEx // Lit = litEx
}; // };
lesScores.Add(score); // lesScores.Add(score);
litEx.Scores.Add(score); // litEx.Scores.Add(score);
nounoursEx.Score = score; // nounoursEx.Score = score;
} // }
} //}
} }
} }

@ -1,144 +0,0 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : NounoursEx.cs
// Author : Marc Chevaldonné
// Creation date : 2016-11-01
//
// ========================================================================
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ex_042_012_EF_CF_Dictionary
{
/// <summary>
/// espèce de procurateur qui enveloppe un Nounours afin de permettre son lien avec Entity Framework malgré le dictionnaire
/// </summary>
[Table("Nounours")]
public class NounoursEx : INounours, IEquatable<NounoursEx>
{
/// <summary>
/// le Nounours wrappé (n'est pas enregistré en base)
/// </summary>
[NotMapped]
Nounours Nounours
{
get; set;
}
/// <summary>
/// wrapper sur la propriété UniqueId du Nounours.
/// Cette clé n'est pas générée lors de l'insertion en base
/// Elle est utilisée comme clé étrangère pour établier une relation one to one entre Nounours et Score.
/// </summary>
[Key, ForeignKey("Score")]
public Guid UniqueId
{
get { return Nounours.UniqueId; }
set { Nounours.UniqueId = value; }
}
/// <summary>
/// le Score (permettra de remplacer le dictionnaire dans Lit)
/// </summary>
public Score Score
{
get; set;
}
public NounoursEx()
{
Nounours = new Nounours();
}
public NounoursEx(INounours nounours)
{
Nounours = nounours as Nounours;
}
/// <summary>
/// wrapper pour le nom du Nounours
/// </summary>
[Required]
[MaxLength(256)]
public string Nom
{
get { return Nounours.Nom; }
set { Nounours.Nom = value; }
}
/// <summary>
/// wrapper pour le nombre de poils du nounours
/// </summary>
public int NbPoils
{
get { return Nounours.NbPoils; }
set { Nounours.NbPoils = value; }
}
/// <summary>
/// wrapper pour la date de naissance du nounours
/// </summary>
[Column("Naissance")]
public DateTime DateDeNaissance
{
get { return Nounours.DateDeNaissance; }
set { Nounours.DateDeNaissance = value; }
}
public override string ToString()
{
return $"{UniqueId}: {Nom} ({DateDeNaissance:dd/MM/yyyy}, {NbPoils} poils)";
}
/// <summary>
/// returns a hash code in order to use this class in hash table
/// </summary>
/// <returns>hash code</returns>
public override int GetHashCode()
{
return Nounours.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 NounoursEx);
}
/// <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(NounoursEx other)
{
return this.Nounours.Equals(other.Nounours);
}
}
}

@ -19,12 +19,12 @@ namespace ex_042_012_EF_CF_Dictionary
/// classe permettant de réaliser une relation one to many avec Lit, et one to one avec Nounours /// classe permettant de réaliser une relation one to many avec Lit, et one to one avec Nounours
/// Elle remplace le KeyValuePair<Nounours, int>, type des éléments du dictionaire Scores de Lit. /// Elle remplace le KeyValuePair<Nounours, int>, type des éléments du dictionaire Scores de Lit.
/// </summary> /// </summary>
public class Score : Item<NounoursEx, int> public class Score : Item<NounoursEntity, int>
{ {
/// <summary> /// <summary>
/// lien vers le LitEx pour la liaison one to many avec LitEx /// lien vers le LitEx pour la liaison one to many avec LitEx
/// </summary> /// </summary>
public LitEx Lit public LitEntity Lit
{ {
get; set; get; set;
} }

@ -44,41 +44,18 @@ namespace ex_042_012_EF_CF_Dictionary
{ {
//choix de la stratégie et remplissage avec des données stubbées //choix de la stratégie et remplissage avec des données stubbées
DbContextInitializer.Seed(db); DbContextInitializer.Seed(db);
}
WriteLine("Récupération des données sans passer par les classes Model :\n"); using (NounoursDBEntities db = new NounoursDBEntities())
{
WriteLine("nounours : "); WriteLine("les nounours : ");
foreach (var n in db.NounoursSet/*.Include("Score")*/) foreach (var n in db.NounoursSet)
{
WriteLine($"\t{n} - Score: {n.Score.Value}");
}
WriteLine("lits : ");
foreach (var l in db.LitsSet)
{
WriteLine($"\t{l.Propriétaire}");
foreach (var kvp in l.Scores)
{
WriteLine($"\t\t{kvp.Key.Nom}: {kvp.Value}");
}
}
WriteLine("\n\nRécupération des données en passant par une projection dans les classes du Model :\n");
if (!db.GetAll(out var lits, out var nounours))
{
Console.WriteLine("oups... la projection a échoué.");
}
WriteLine("nounours : ");
foreach (var n in nounours)
{ {
WriteLine($"\t{n}"); WriteLine($"\t{n}");
} }
WriteLine("lits : "); WriteLine("les lits : ");
foreach (var l in lits) foreach (var l in db.LitsSet)
{ {
WriteLine($"\t{l.Propriétaire}"); WriteLine($"\t{l.Propriétaire}");
foreach (var kvp in l.Scores) foreach (var kvp in l.Scores)

Loading…
Cancel
Save