diff --git a/README.md b/README.md index 0e01d32..a3dea5f 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ $ dotnet tool install --global dotnet-ef * Dans la console, tapez la commande suivante: ```shell -Update-Database +$ dotnet ef database update ``` * L'application est prête à être utilisée. diff --git a/Sources/BowlingApp/BowlingApp.csproj b/Sources/BowlingApp/BowlingApp.csproj index d267dee..9f13908 100644 --- a/Sources/BowlingApp/BowlingApp.csproj +++ b/Sources/BowlingApp/BowlingApp.csproj @@ -3,6 +3,7 @@ Exe net6.0 + $(MSBuildProjectDirectory) diff --git a/Sources/BowlingApp/Match.cs b/Sources/BowlingApp/Match.cs index 66470be..3a17c64 100644 --- a/Sources/BowlingApp/Match.cs +++ b/Sources/BowlingApp/Match.cs @@ -64,10 +64,14 @@ namespace BowlingApp public static void JeuIndividuel(Saissiseur saissiseur) { + // Création des parties pour chaque joueur + Manager manager = new Manager(new EquipeDbDataManager(), new PartieDbDataManager(), new JoueurDbDataManager()); + Afficheur.InviteNrb("Joueur"); int nbrj = saissiseur.CollecteNbr(); List joueurs = new List(); + // Création des joueurs for (int j = 0; j < nbrj; j++) { @@ -77,9 +81,8 @@ namespace BowlingApp joueurs.Add(joueur); } + - // Création des parties pour chaque joueur - Manager manager = new Manager(new EquipeDbDataManager(), new PartieDbDataManager(), new JoueurDbDataManager()); for (int i = 0; i < joueurs.Count; i++) { @@ -119,16 +122,31 @@ namespace BowlingApp Joueur joueur = new Joueur(Nom); Partie partie = new Partie(joueur); Manager manager = new Manager(new EquipeDbDataManager(), new PartieDbDataManager(), new JoueurDbDataManager()); + Lancer(partie, saissiseur); + joueur.AddPartie(partie); + //manager.AddPartie(partie); manager.AddJoueur(joueur); + } + + + private static void CreerPatier() + { + /* Afficheur.InviteNom("Joueur"); + string Nom = saissiseur.CollecteNom(); + Joueur joueur = new Joueur(Nom); + Partie partie = new Partie(joueur); + Manager manager = new Manager(new EquipeDbDataManager(), new PartieDbDataManager(), new JoueurDbDataManager()); Lancer(partie, saissiseur); - manager.AddPartie(partie); + joueur.AddPartie(partie); + //manager.AddPartie(partie); + manager.AddJoueur(joueur);*/ } /// /// Faire des lancers /// /// - /// + /// PartieEntities { get; set; } = new List(); #endregion } } \ No newline at end of file diff --git a/Sources/BowlingEF/Entities/PartieEntity.cs b/Sources/BowlingEF/Entities/PartieEntity.cs index 54b799b..4929b51 100644 --- a/Sources/BowlingEF/Entities/PartieEntity.cs +++ b/Sources/BowlingEF/Entities/PartieEntity.cs @@ -17,11 +17,9 @@ namespace BowlingEF.Entities [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long Id { get; set; } - public JoueurEntity Joueur { get; set; } - [ForeignKey("JoueurId")] - [Required] - public long JoueurId { get; set; } + [ForeignKey("JoueurForeignKey")] + public JoueurEntity Joueur { get; set; } [Required] public DateTime Date { get; set; } public ICollection Frames { get; set; } diff --git a/Sources/BowlingEF/Migrations/20221025144845_myMigration.Designer.cs b/Sources/BowlingEF/Migrations/20221025144845_myMigration.Designer.cs new file mode 100644 index 0000000..b6b58a2 --- /dev/null +++ b/Sources/BowlingEF/Migrations/20221025144845_myMigration.Designer.cs @@ -0,0 +1,154 @@ +// +using System; +using BowlingEF.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BowlingEF.Migrations +{ + [DbContext(typeof(BowlingContext))] + [Migration("20221025144845_myMigration")] + partial class myMigration + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.10"); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Nom") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Equipes"); + }); + + modelBuilder.Entity("BowlingEF.Entities.FrameEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Lancer1") + .HasColumnType("INTEGER"); + + b.Property("Lancer2") + .HasColumnType("INTEGER"); + + b.Property("Lancer3") + .HasColumnType("INTEGER"); + + b.Property("Numero") + .HasColumnType("INTEGER"); + + b.Property("PartieId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("PartieId"); + + b.ToTable("Frames"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EquipeEntityId") + .HasColumnType("INTEGER"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("EquipeEntityId"); + + b.ToTable("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Date") + .HasColumnType("TEXT"); + + b.Property("JoueurForeignKey") + .HasColumnType("INTEGER"); + + b.Property("Score") + .IsRequired() + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("JoueurForeignKey"); + + b.ToTable("Parties"); + }); + + modelBuilder.Entity("BowlingEF.Entities.FrameEntity", b => + { + b.HasOne("BowlingEF.Entities.PartieEntity", "Partie") + .WithMany("Frames") + .HasForeignKey("PartieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Partie"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.HasOne("BowlingEF.Entities.EquipeEntity", null) + .WithMany("Joueurs") + .HasForeignKey("EquipeEntityId"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.HasOne("BowlingEF.Entities.JoueurEntity", "Joueur") + .WithMany("PartieEntities") + .HasForeignKey("JoueurForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Joueur"); + }); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Navigation("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.Navigation("PartieEntities"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Navigation("Frames"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/BowlingEF/Migrations/20221025144845_myMigration.cs b/Sources/BowlingEF/Migrations/20221025144845_myMigration.cs new file mode 100644 index 0000000..99c5c03 --- /dev/null +++ b/Sources/BowlingEF/Migrations/20221025144845_myMigration.cs @@ -0,0 +1,119 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BowlingEF.Migrations +{ + public partial class myMigration : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Equipes", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Nom = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Equipes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Joueurs", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Pseudo = table.Column(type: "TEXT", nullable: false), + EquipeEntityId = table.Column(type: "INTEGER", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Joueurs", x => x.Id); + table.ForeignKey( + name: "FK_Joueurs_Equipes_EquipeEntityId", + column: x => x.EquipeEntityId, + principalTable: "Equipes", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Parties", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + JoueurForeignKey = table.Column(type: "INTEGER", nullable: false), + Date = table.Column(type: "TEXT", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Parties", x => x.Id); + table.ForeignKey( + name: "FK_Parties_Joueurs_JoueurForeignKey", + column: x => x.JoueurForeignKey, + principalTable: "Joueurs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Frames", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Numero = table.Column(type: "INTEGER", nullable: false), + Lancer1 = table.Column(type: "INTEGER", nullable: false), + Lancer2 = table.Column(type: "INTEGER", nullable: false), + Lancer3 = table.Column(type: "INTEGER", nullable: false), + PartieId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Frames", x => x.Id); + table.ForeignKey( + name: "FK_Frames_Parties_PartieId", + column: x => x.PartieId, + principalTable: "Parties", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Frames_PartieId", + table: "Frames", + column: "PartieId"); + + migrationBuilder.CreateIndex( + name: "IX_Joueurs_EquipeEntityId", + table: "Joueurs", + column: "EquipeEntityId"); + + migrationBuilder.CreateIndex( + name: "IX_Parties_JoueurForeignKey", + table: "Parties", + column: "JoueurForeignKey"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Frames"); + + migrationBuilder.DropTable( + name: "Parties"); + + migrationBuilder.DropTable( + name: "Joueurs"); + + migrationBuilder.DropTable( + name: "Equipes"); + } + } +} diff --git a/Sources/BowlingEF/Migrations/BowlingContextModelSnapshot.cs b/Sources/BowlingEF/Migrations/BowlingContextModelSnapshot.cs new file mode 100644 index 0000000..b72dd97 --- /dev/null +++ b/Sources/BowlingEF/Migrations/BowlingContextModelSnapshot.cs @@ -0,0 +1,152 @@ +// +using System; +using BowlingEF.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace BowlingEF.Migrations +{ + [DbContext(typeof(BowlingContext))] + partial class BowlingContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.10"); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Nom") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Equipes"); + }); + + modelBuilder.Entity("BowlingEF.Entities.FrameEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Lancer1") + .HasColumnType("INTEGER"); + + b.Property("Lancer2") + .HasColumnType("INTEGER"); + + b.Property("Lancer3") + .HasColumnType("INTEGER"); + + b.Property("Numero") + .HasColumnType("INTEGER"); + + b.Property("PartieId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("PartieId"); + + b.ToTable("Frames"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EquipeEntityId") + .HasColumnType("INTEGER"); + + b.Property("Pseudo") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("EquipeEntityId"); + + b.ToTable("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Date") + .HasColumnType("TEXT"); + + b.Property("JoueurForeignKey") + .HasColumnType("INTEGER"); + + b.Property("Score") + .IsRequired() + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("JoueurForeignKey"); + + b.ToTable("Parties"); + }); + + modelBuilder.Entity("BowlingEF.Entities.FrameEntity", b => + { + b.HasOne("BowlingEF.Entities.PartieEntity", "Partie") + .WithMany("Frames") + .HasForeignKey("PartieId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Partie"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.HasOne("BowlingEF.Entities.EquipeEntity", null) + .WithMany("Joueurs") + .HasForeignKey("EquipeEntityId"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.HasOne("BowlingEF.Entities.JoueurEntity", "Joueur") + .WithMany("PartieEntities") + .HasForeignKey("JoueurForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Joueur"); + }); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Navigation("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.JoueurEntity", b => + { + b.Navigation("PartieEntities"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Navigation("Frames"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/BowlingEF/bowling.db b/Sources/BowlingEF/bowling.db new file mode 100644 index 0000000..491eddd Binary files /dev/null and b/Sources/BowlingEF/bowling.db differ diff --git a/Sources/BowlingLib/Model/Frame.cs b/Sources/BowlingLib/Model/Frame.cs index 2e3f41c..5b5696c 100644 --- a/Sources/BowlingLib/Model/Frame.cs +++ b/Sources/BowlingLib/Model/Frame.cs @@ -149,7 +149,7 @@ namespace BowlingLib.Model /// /// /// - public Frame(long id, int numero, int lancer1, int lancer2, [AllowNull] int lancer3) : this(numero) + public Frame(long id, int numero, int lancer1, int lancer2, int lancer3) : this(numero) { this.id = id; Lancer1 = new Lancer(lancer1); diff --git a/Sources/BowlingLib/Model/Joueur.cs b/Sources/BowlingLib/Model/Joueur.cs index 21059d9..af1132c 100644 --- a/Sources/BowlingLib/Model/Joueur.cs +++ b/Sources/BowlingLib/Model/Joueur.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Collections.ObjectModel; + namespace BowlingLib.Model { /// @@ -14,12 +16,16 @@ namespace BowlingLib.Model #region Propriétés private string pseudo; private readonly long id; + + private readonly List parties=new(); + public ReadOnlyCollection Parties { get; } #endregion #region Constructeurs public Joueur(string pseudo) { this.Pseudo = pseudo; + Parties = new ReadOnlyCollection(parties); } public Joueur(long id, string pseudo) : this(pseudo) @@ -76,6 +82,11 @@ namespace BowlingLib.Model return Pseudo.GetHashCode(); } + public void AddPartie(Partie p) + { + parties.Add(p); + } + #endregion } } diff --git a/Sources/BowlingLib/Model/Partie.cs b/Sources/BowlingLib/Model/Partie.cs index 88f4fdc..5216a21 100644 --- a/Sources/BowlingLib/Model/Partie.cs +++ b/Sources/BowlingLib/Model/Partie.cs @@ -46,7 +46,7 @@ namespace BowlingLib.Model public Partie(Joueur joueur) { this.Joueur = joueur; - + Date = DateTime.Now; Frames = new ReadOnlyCollection(frames); } @@ -77,6 +77,7 @@ namespace BowlingLib.Model /// le Score d'une partie public int? GetScore() { + score = 0; for (int i = 0; i < Frames.Count; i++) { score += Frames[i].QuillesTombees; diff --git a/Sources/BowlingMaping/EquipeDbDataManager.cs b/Sources/BowlingMaping/EquipeDbDataManager.cs index ce00454..6d36f28 100644 --- a/Sources/BowlingMaping/EquipeDbDataManager.cs +++ b/Sources/BowlingMaping/EquipeDbDataManager.cs @@ -24,12 +24,22 @@ namespace BowlingMaping { Id = _equipe.Id, Nom = _equipe.Nom, - Joueurs = _equipe.Joueurs.Select(j => new JoueurEntity - { - Id = j.Id, - Pseudo = j.Pseudo - }).ToList() + }; + + for(int i = 0; i<_equipe.Joueurs.Count; i++) + { + JoueurEntity joueur = new JoueurEntity + { + Id = _equipe.Joueurs[i].Id, + Pseudo = _equipe.Joueurs[i].Pseudo, + //Equipe = entity + + }; + + entity.Joueurs.Add(joueur); + } + context.Equipes.Add(entity); result = await context.SaveChangesAsync() == 1; } diff --git a/Sources/BowlingMaping/JoueurDbDataManager.cs b/Sources/BowlingMaping/JoueurDbDataManager.cs index 75ddc72..1f467ac 100644 --- a/Sources/BowlingMaping/JoueurDbDataManager.cs +++ b/Sources/BowlingMaping/JoueurDbDataManager.cs @@ -3,8 +3,10 @@ using BowlingEF.Entities; using BowlingLib.Model; using Business; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -27,13 +29,51 @@ namespace BowlingMaping bool result = false; using (var context = new BowlingContext()) { - JoueurEntity entity=new JoueurEntity + try { - Id = _joueur.Id, - Pseudo = _joueur.Pseudo, - }; - context.Joueurs.Add(entity); - result =await context.SaveChangesAsync() == 1; + //Mapping entre la classe joueur et la classe joueurEntity + JoueurEntity entity = new JoueurEntity + { + Id = _joueur.Id, + Pseudo = _joueur.Pseudo, + }; + + //Parcourt de la liste des parties d'un joueur + for (int i = 0; i < _joueur.Parties.Count; i++) + { + //Mapping entre les parties d'un joueur et les partieEntity d'une partieEntity + PartieEntity partieEntity = new PartieEntity + { + Joueur = entity, + Date = _joueur.Parties[i].Date, + Score = _joueur.Parties[i].Score + + }; + + //Parcourt de la liste des frames d'une partie + for (int j = 0; j < _joueur.Parties[i].Frames.Count; j++) + { + //Mapping entre les frames d'une partie et les frameEntity d'une partieEntity + FrameEntity frameEntity = new FrameEntity + { + Id = _joueur.Parties[i].Frames[j].Id, + Lancer1 = _joueur.Parties[i].Frames[j].Lancer1.QuillesTombees, + Lancer2 = _joueur.Parties[i].Frames[j].Lancer2.QuillesTombees, + Lancer3 = (_joueur.Parties[i].Frames[j].Lancer3 == null) ? 0 : _joueur.Parties[i].Frames[j].Lancer3.QuillesTombees,//si Lancer3 est null il prend la valeur Zero + Partie = partieEntity + }; + partieEntity.Frames.Add(frameEntity); + } + entity.PartieEntities.Add(partieEntity); + } + context.Joueurs.Add(entity); + result = await context.SaveChangesAsync() == 1; + } + catch (Exception ex) + { + Debug.WriteLine(ex); + throw; + } } return result; } diff --git a/Sources/BowlingMaping/PartieDbDataManager.cs b/Sources/BowlingMaping/PartieDbDataManager.cs index 4934ccc..deab746 100644 --- a/Sources/BowlingMaping/PartieDbDataManager.cs +++ b/Sources/BowlingMaping/PartieDbDataManager.cs @@ -31,12 +31,21 @@ namespace BowlingMaping { Id = _partie.Id, Date = _partie.Date, - JoueurId = _partie.Joueur.Id, Score = _partie.Score }; context.Parties.Add(entity); - result = await context.SaveChangesAsync() == 1; + try + { + var data = await context.SaveChangesAsync(); + result = data == 1; + } + catch (Exception ex) + { + Console.WriteLine(ex); + throw; + } } + return result; } @@ -69,7 +78,7 @@ namespace BowlingMaping { PartieEntity entity = context.Parties.Find(_partie.Id); entity.Date = _partie.Date; - entity.JoueurId = _partie.Joueur.Id; + //entity.JoueurId = _partie.Joueur.Id; entity.Score = _partie.Score; result =await context.SaveChangesAsync() == 1; }