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);
Nounours[] lesNounours;
Lit[] lesLits;
NounoursEntity[] lesNounours;
LitEntity[] lesLits;
List<Score> lesScores = new List<Score>();
//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 };
//*****************

@ -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>
public class NounoursDBEntities : DbContext
{
public virtual DbSet<NounoursEx> NounoursSet { get; set; }
public virtual DbSet<LitEx> LitsSet { get; set; }
public virtual DbSet<NounoursEntity> NounoursSet { get; set; }
public virtual DbSet<LitEntity> LitsSet { get; set; }
public virtual DbSet<Score> 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.
/// </summary>
/// <param name="modelBuilder"></param>
//protected override void OnModelCreating(ModelBuilder modelBuilder)
//{
// //création de la table TableNounours
// modelBuilder.Entity<Nounours>().ToTable("Nounours"); //nom de la table
// modelBuilder.Entity<Nounours>().HasKey(n => n.UniqueId); //définition de la clé primaire
// modelBuilder.Entity<Nounours>().Property(n => n.UniqueId);
// modelBuilder.Entity<Nounours>().Property(n => n.Nom).IsRequired()
// .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<Nounours>().Property<Guid>("ForeignKey");
// modelBuilder.Entity<Nounours>().Property<Score>("Score");
// //note : la colonne NbPoils n'est pas changée : utilisation des conventions EF
// //création de la table "Lits"
// 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>().Property(c => c.UniqueId)
// .ValueGeneratedOnAdd();
// modelBuilder.Entity<Lit>().Property<IEnumerable<Score>>("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<Score>() //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<Lit>()
// .HasMany("ScoresList")
// .WithOne("Lit")
// .HasForeignKey("UniqueId");
// base.OnModelCreating(modelBuilder);
//}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//création de la table TableNounours
modelBuilder.Entity<NounoursEntity>().ToTable("Nounours"); //nom de la table
modelBuilder.Entity<NounoursEntity>().HasKey(n => n.UniqueId); //définition de la clé primaire
modelBuilder.Entity<NounoursEntity>().Property(n => n.UniqueId);
modelBuilder.Entity<NounoursEntity>().Property(n => n.Nom).IsRequired()
.HasMaxLength(256); //définition de la colonne Nom
modelBuilder.Entity<NounoursEntity>().Property(n => n.DateDeNaissance).HasColumnName("Naissance"); //changement du nom de la colonne Naissance
//modelBuilder.Entity<NounoursEntity>().Property<Guid>("ForeignKey");
//modelBuilder.Entity<Nounours>().Property<Score>("Score");
//note : la colonne NbPoils n'est pas changée : utilisation des conventions EF
// //création de la table "Lits"
// 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>().Property(c => c.UniqueId)
// .ValueGeneratedOnAdd();
// modelBuilder.Entity<Lit>().Property<IEnumerable<Score>>("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<Score>() //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<NounoursEntity>(ne => ne.UniqueId);//dont la propriété UniqueId est une Foreign Key
//remplace la ForeignKey
modelBuilder.Entity<LitEntity>()
.HasMany("mScores")
.WithOne("Lit")
.HasForeignKey("UniqueId");
base.OnModelCreating(modelBuilder);
}
/// <summary>
/// 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="nounours">les nounours rentrés en base</param>
/// <returns>true si la récupération est réussie, false sinon</returns>
public bool GetAll(out IEnumerable<Lit> lits, out IEnumerable<INounours> 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<ILit> lits, out IEnumerable<INounours> 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<Score> lesScores = new List<Score>();
/// <summary>
@ -111,47 +111,47 @@ namespace ex_042_012_EF_CF_Dictionary
/// </summary>
/// <param name="lesLits"></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
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();
/// <summary>
/// transforme les dictionnaires en collection de scores
/// </summary>
/// <param name="litEx"></param>
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;
}
}
/// <param name="lit"></param>
//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;
// }
//}
}
}

@ -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
/// Elle remplace le KeyValuePair<Nounours, int>, type des éléments du dictionaire Scores de Lit.
/// </summary>
public class Score : Item<NounoursEx, int>
public class Score : Item<NounoursEntity, int>
{
/// <summary>
/// lien vers le LitEx pour la liaison one to many avec LitEx
/// </summary>
public LitEx Lit
public LitEntity Lit
{
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
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)

Loading…
Cancel
Save