From 65edc7fa4e6fb5ef7c8571a383dd66d59438e6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Chevaldonn=C3=A9?= Date: Tue, 24 Dec 2019 18:31:22 +0100 Subject: [PATCH] temp on ex_042_012_EF_CF_Dictionary --- .../DbEntities/DbContextInitializer.cs | 24 +-- .../DbEntities/LitEx.cs | 105 ---------- .../DbEntities/NounoursDbEntities.cs | 198 +++++++++--------- .../DbEntities/NounoursEx.cs | 144 ------------- .../DbEntities/Score.cs | 4 +- ex_042_012_EF_CF_Dictionary/Program.cs | 37 +--- 6 files changed, 120 insertions(+), 392 deletions(-) delete mode 100644 ex_042_012_EF_CF_Dictionary/DbEntities/LitEx.cs delete mode 100644 ex_042_012_EF_CF_Dictionary/DbEntities/NounoursEx.cs diff --git a/ex_042_012_EF_CF_Dictionary/DbEntities/DbContextInitializer.cs b/ex_042_012_EF_CF_Dictionary/DbEntities/DbContextInitializer.cs index 04a552e..26bddbb 100644 --- a/ex_042_012_EF_CF_Dictionary/DbEntities/DbContextInitializer.cs +++ b/ex_042_012_EF_CF_Dictionary/DbEntities/DbContextInitializer.cs @@ -28,31 +28,31 @@ namespace ex_042_012_EF_CF_Dictionary { SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways); - Nounours[] lesNounours; - Lit[] lesLits; + NounoursEntity[] lesNounours; + LitEntity[] lesLits; List lesScores = new List(); //données stubbées //simulation de données en utilisant les types du Model - 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 beluga = new Nounours { Nom = "Beluga", DateDeNaissance = new DateTime(2012, 07, 29), NbPoils = 0 }; - Nounours singe = new Nounours { Nom = "Singe", DateDeNaissance = new DateTime(2009, 08, 09), NbPoils = 1345 }; - Nounours girafe = new Nounours { Nom = "Girafe", DateDeNaissance = new DateTime(2007, 11, 02), NbPoils = 567 }; - lesNounours = new Nounours[] { chewie, yoda, ewok, beluga, singe, girafe }; + NounoursEntity chewie = new NounoursEntity { Nom = "Chewbacca", DateDeNaissance = new DateTime(1977, 5, 27), NbPoils = 1234567 }; + NounoursEntity yoda = new NounoursEntity { Nom = "Yoda", DateDeNaissance = new DateTime(1980, 5, 21), NbPoils = 3 }; + NounoursEntity ewok = new NounoursEntity { Nom = "Ewok", DateDeNaissance = new DateTime(1983, 5, 25), NbPoils = 3456789 }; + NounoursEntity beluga = new NounoursEntity { Nom = "Beluga", DateDeNaissance = new DateTime(2012, 07, 29), NbPoils = 0 }; + NounoursEntity singe = new NounoursEntity { Nom = "Singe", DateDeNaissance = new DateTime(2009, 08, 09), NbPoils = 1345 }; + NounoursEntity girafe = new NounoursEntity { Nom = "Girafe", DateDeNaissance = new DateTime(2007, 11, 02), NbPoils = 567 }; + 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[yoda] = 200; litDeLuke[ewok] = 1; - Lit monLit = new Lit() { Propriétaire = "Moi" }; + LitEntity monLit = new LitEntity() { Propriétaire = "Moi" }; monLit[beluga] = 10; monLit[singe] = 100; monLit[girafe] = 1000; - lesLits = new Lit[] { litDeLuke, monLit }; + lesLits = new LitEntity[] { litDeLuke, monLit }; //***************** diff --git a/ex_042_012_EF_CF_Dictionary/DbEntities/LitEx.cs b/ex_042_012_EF_CF_Dictionary/DbEntities/LitEx.cs deleted file mode 100644 index 9fff973..0000000 --- a/ex_042_012_EF_CF_Dictionary/DbEntities/LitEx.cs +++ /dev/null @@ -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 -{ - /// - /// espèce de procurateur qui enveloppe un Lit afin de permettre son lien avec Entity Framework malgré le dictionnaire - /// - [Table("Lits")] - public class LitEx : ILit - { - /// - /// l'objet Lit wrappé (n'est pas enregistré en base) - /// - [NotMapped] - public Lit Lit - { - get; set; - } - - /// - /// wrapper sur la propriété UniqueId du Lit - /// généré lors de l'insertion en base - /// - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid UniqueId - { - get { return Lit.UniqueId; } - set { Lit.UniqueId = value; } - } - - /// - /// wrapper de la propriété Propriétaire du Lit - /// - public string Propriétaire - { - get { return Lit.Propriétaire; } - set { Lit.Propriétaire = value; } - } - - /// - /// remplace le dictionnaire : on utilise une collection de Scores afin d'établir une relation one to many entre - /// LitEx et Score - /// - public virtual ICollection Scores - { - get; - set; - } = new List(); - - ReadOnlyDictionary 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(); - } -} diff --git a/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursDbEntities.cs b/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursDbEntities.cs index 00665d8..0104e0d 100644 --- a/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursDbEntities.cs +++ b/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursDbEntities.cs @@ -14,8 +14,8 @@ namespace ex_042_012_EF_CF_Dictionary /// public class NounoursDBEntities : DbContext { - public virtual DbSet NounoursSet { get; set; } - public virtual DbSet LitsSet { get; set; } + public virtual DbSet NounoursSet { get; set; } + public virtual DbSet LitsSet { get; set; } public virtual DbSet ScoresSet { get; set; } 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. /// /// - //protected override void OnModelCreating(ModelBuilder modelBuilder) - //{ - // //création de la table TableNounours - // modelBuilder.Entity().ToTable("Nounours"); //nom de la table - // modelBuilder.Entity().HasKey(n => n.UniqueId); //définition de la clé primaire - // modelBuilder.Entity().Property(n => n.UniqueId); - // modelBuilder.Entity().Property(n => n.Nom).IsRequired() - // .HasMaxLength(256); //définition de la colonne Nom - // modelBuilder.Entity().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); //changement du nom de la colonne Naissance - // modelBuilder.Entity().Property("ForeignKey"); - // modelBuilder.Entity().Property("Score"); - // //note : la colonne NbPoils n'est pas changée : utilisation des conventions EF - - // //création de la table "Lits" - // modelBuilder.Entity().ToTable("Lits"); // nom de la table - // modelBuilder.Entity().HasKey(c => c.UniqueId); //définition de la clé primaire - // modelBuilder.Entity().Property(c => c.UniqueId) - // .ValueGeneratedOnAdd(); - // modelBuilder.Entity().Property>("ScoresList"); - // //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 - // modelBuilder.Entity() //l'entité Nounours... - // .HasOne("Nounours") //a une propriété obligatoire Carnet... - // .WithOne("Score") //reliée à la propriété Owner du Carnet... - // .HasForeignKey("Nounours", "ForeignKey");//dont la propriété UniqueId est une Foreign Key - // //remplace la ForeignKey - - // modelBuilder.Entity() - // .HasMany("ScoresList") - // .WithOne("Lit") - // .HasForeignKey("UniqueId"); - - // base.OnModelCreating(modelBuilder); - //} + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + //création de la table TableNounours + modelBuilder.Entity().ToTable("Nounours"); //nom de la table + modelBuilder.Entity().HasKey(n => n.UniqueId); //définition de la clé primaire + modelBuilder.Entity().Property(n => n.UniqueId); + modelBuilder.Entity().Property(n => n.Nom).IsRequired() + .HasMaxLength(256); //définition de la colonne Nom + modelBuilder.Entity().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); //changement du nom de la colonne Naissance + //modelBuilder.Entity().Property("ForeignKey"); + //modelBuilder.Entity().Property("Score"); + //note : la colonne NbPoils n'est pas changée : utilisation des conventions EF + + // //création de la table "Lits" + // modelBuilder.Entity().ToTable("Lits"); // nom de la table + // modelBuilder.Entity().HasKey(c => c.UniqueId); //définition de la clé primaire + // modelBuilder.Entity().Property(c => c.UniqueId) + // .ValueGeneratedOnAdd(); + // modelBuilder.Entity().Property>("ScoresList"); + // //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 + modelBuilder.Entity() //l'entité Nounours... + .HasOne(s => s.Key) //a une propriété obligatoire Carnet... + .WithOne(ne => ne.Score) //reliée à la propriété Owner du Carnet... + .HasForeignKey(ne => ne.UniqueId);//dont la propriété UniqueId est une Foreign Key + //remplace la ForeignKey + + modelBuilder.Entity() + .HasMany("mScores") + .WithOne("Lit") + .HasForeignKey("UniqueId"); + + base.OnModelCreating(modelBuilder); + } /// /// 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 /// les lits rentrés en base /// les nounours rentrés en base /// true si la récupération est réussie, false sinon - public bool GetAll(out IEnumerable lits, out IEnumerable nounours) - { - try - { - // 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); - //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); - - //parcourt la collection des scores contenus en base... - foreach (Score score in ScoresSet) - { - //...pour chaque score ... - //... trouve le lit concerné par ce score... - Lit leLit = lits.Single(l => l.Propriétaire == score.Lit.Propriétaire); - //...trouve le nounours concerné par ce score... - INounours leNounours = nounours.Single(n => n.Equals(score.Key)); - //... met à jour le dictionnaire dans l'instance de Lit - leLit[leNounours] = score.Value; - } - return true; - } - catch (Exception e) - { - Debug.WriteLine(e.Message); - lits = null; - nounours = null; - return false; - } - } + //public bool GetAll(out IEnumerable lits, out IEnumerable nounours) + //{ + // try + // { + // // 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); + // //récupère la collection de LitEx contenus dans la base et les projette en collection de Lit + // lits = LitsSet.ToList(); + + // //parcourt la collection des scores contenus en base... + // foreach (Score score in ScoresSet) + // { + // //...pour chaque score ... + // //... trouve le lit concerné par ce score... + // ILit leLit = lits.Single(l => l.Propriétaire == score.Lit.Propriétaire); + // //...trouve le nounours concerné par ce score... + // INounours leNounours = nounours.Single(n => n.Equals(score.Key)); + // //... met à jour le dictionnaire dans l'instance de Lit + // leLit[leNounours] = score.Value; + // } + // return true; + // } + // catch (Exception e) + // { + // Debug.WriteLine(e.Message); + // lits = null; + // nounours = null; + // return false; + // } + //} - NounoursEx[] lesNounoursEx; - LitEx[] lesLitsEx; + //INounours[] lesNounours; + //ILit[] lesLits; List lesScores = new List(); /// @@ -111,47 +111,47 @@ namespace ex_042_012_EF_CF_Dictionary /// /// /// - public void AddAll(IEnumerable lesLits, IEnumerable lesNounours) + public void AddAll(IEnumerable lesLits, IEnumerable lesNounours) { - //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(); - lesLitsEx = lesLits.Select(l => new LitEx { Lit = l }).ToArray(); + // //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(); + // //lesLitsEx = lesLits.Select(l => new LitEx { Lit = l }).ToArray(); - //met à jour la collection de scores - foreach (var litEx in lesLitsEx) - { - UpdateScores(litEx); - } + // //met à jour la collection de scores + // foreach (var litEx in lesLitsEx) + // { + // UpdateScores(litEx); + // } //met à jour les tables - NounoursSet.AddRange(lesNounoursEx); - LitsSet.AddRange(lesLitsEx); + NounoursSet.AddRange(lesNounours); + LitsSet.AddRange(lesLits); ScoresSet.AddRange(lesScores); SaveChanges(); } - private INounoursEqualityComparer NounoursEqComparer { get; set; } = new INounoursEqualityComparer(); + //private INounoursEqualityComparer NounoursEqComparer { get; set; } = new INounoursEqualityComparer(); /// /// transforme les dictionnaires en collection de scores /// - /// - private void UpdateScores(LitEx litEx) - { - foreach (var kvp in litEx.Lit.Scores) - { - NounoursEx nounoursEx = lesNounoursEx.Single(nEx => NounoursEqComparer.Equals(nEx, kvp.Key)); - Score score = new Score() - { - Key = nounoursEx, - Value = kvp.Value, - Lit = litEx - }; - lesScores.Add(score); - litEx.Scores.Add(score); - nounoursEx.Score = score; - } - } + /// + //private void UpdateScores(ILit lit) + //{ + // foreach (var kvp in lit.Scores) + // { + // NounoursEx nounoursEx = lesNounoursEx.Single(nEx => NounoursEqComparer.Equals(nEx, kvp.Key)); + // Score score = new Score() + // { + // Key = nounoursEx, + // Value = kvp.Value, + // Lit = litEx + // }; + // lesScores.Add(score); + // litEx.Scores.Add(score); + // nounoursEx.Score = score; + // } + //} } } diff --git a/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursEx.cs b/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursEx.cs deleted file mode 100644 index 985b387..0000000 --- a/ex_042_012_EF_CF_Dictionary/DbEntities/NounoursEx.cs +++ /dev/null @@ -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 -{ - - /// - /// espèce de procurateur qui enveloppe un Nounours afin de permettre son lien avec Entity Framework malgré le dictionnaire - /// - [Table("Nounours")] - public class NounoursEx : INounours, IEquatable - { - /// - /// le Nounours wrappé (n'est pas enregistré en base) - /// - [NotMapped] - Nounours Nounours - { - get; set; - } - - /// - /// 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. - /// - [Key, ForeignKey("Score")] - public Guid UniqueId - { - get { return Nounours.UniqueId; } - set { Nounours.UniqueId = value; } - } - - /// - /// le Score (permettra de remplacer le dictionnaire dans Lit) - /// - public Score Score - { - get; set; - } - - public NounoursEx() - { - Nounours = new Nounours(); - } - - public NounoursEx(INounours nounours) - { - Nounours = nounours as Nounours; - } - - /// - /// wrapper pour le nom du Nounours - /// - [Required] - [MaxLength(256)] - public string Nom - { - get { return Nounours.Nom; } - set { Nounours.Nom = value; } - } - - /// - /// wrapper pour le nombre de poils du nounours - /// - public int NbPoils - { - get { return Nounours.NbPoils; } - set { Nounours.NbPoils = value; } - } - - /// - /// wrapper pour la date de naissance du nounours - /// - [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)"; - } - - /// - /// returns a hash code in order to use this class in hash table - /// - /// hash code - public override int GetHashCode() - { - return Nounours.GetHashCode(); - } - - /// - /// checks if the "right" object is equal to this Nounours or not - /// - /// the other object to be compared with this Nounours - /// true if equals, false if not - 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); - } - - /// - /// checks if this Nounours is equal to the other Nounours - /// - /// the other Nounours to be compared with - /// true if equals - public bool Equals(NounoursEx other) - { - return this.Nounours.Equals(other.Nounours); - } - } -} diff --git a/ex_042_012_EF_CF_Dictionary/DbEntities/Score.cs b/ex_042_012_EF_CF_Dictionary/DbEntities/Score.cs index ebe9c87..67c7ef6 100644 --- a/ex_042_012_EF_CF_Dictionary/DbEntities/Score.cs +++ b/ex_042_012_EF_CF_Dictionary/DbEntities/Score.cs @@ -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 /// Elle remplace le KeyValuePair, type des éléments du dictionaire Scores de Lit. /// - public class Score : Item + public class Score : Item { /// /// lien vers le LitEx pour la liaison one to many avec LitEx /// - public LitEx Lit + public LitEntity Lit { get; set; } diff --git a/ex_042_012_EF_CF_Dictionary/Program.cs b/ex_042_012_EF_CF_Dictionary/Program.cs index f20fe05..249a618 100644 --- a/ex_042_012_EF_CF_Dictionary/Program.cs +++ b/ex_042_012_EF_CF_Dictionary/Program.cs @@ -44,41 +44,18 @@ namespace ex_042_012_EF_CF_Dictionary { //choix de la stratégie et remplissage avec des données stubbées DbContextInitializer.Seed(db); + } - WriteLine("Récupération des données sans passer par les classes Model :\n"); - - WriteLine("nounours : "); - foreach (var n in db.NounoursSet/*.Include("Score")*/) - { - 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) + using (NounoursDBEntities db = new NounoursDBEntities()) + { + WriteLine("les nounours : "); + foreach (var n in db.NounoursSet) { WriteLine($"\t{n}"); } - WriteLine("lits : "); - foreach (var l in lits) + WriteLine("les lits : "); + foreach (var l in db.LitsSet) { WriteLine($"\t{l.Propriétaire}"); foreach (var kvp in l.Scores)