diff --git a/.gitignore b/.gitignore index 54237a9..d767293 100644 --- a/.gitignore +++ b/.gitignore @@ -426,3 +426,5 @@ Network Trash Folder Temporary Items .apdisk +/Sources/BowlingApp/bowling.db-shm +/Sources/BowlingApp/bowling.db-wal diff --git a/Sources/BowlingApp/BowlingApp.csproj b/Sources/BowlingApp/BowlingApp.csproj index dbc61aa..949c03d 100644 --- a/Sources/BowlingApp/BowlingApp.csproj +++ b/Sources/BowlingApp/BowlingApp.csproj @@ -4,8 +4,16 @@ Exe net6.0 + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Sources/BowlingApp/bowling.db b/Sources/BowlingApp/bowling.db new file mode 100644 index 0000000..f519e25 Binary files /dev/null and b/Sources/BowlingApp/bowling.db differ diff --git a/Sources/BowlingEF/BowlingEF.csproj b/Sources/BowlingEF/BowlingEF.csproj index 132c02c..37aa1c1 100644 --- a/Sources/BowlingEF/BowlingEF.csproj +++ b/Sources/BowlingEF/BowlingEF.csproj @@ -6,4 +6,13 @@ enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Sources/BowlingEF/Class1.cs b/Sources/BowlingEF/Class1.cs deleted file mode 100644 index a9cb237..0000000 --- a/Sources/BowlingEF/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BowlingEF -{ - public class Class1 - { - - } -} \ No newline at end of file diff --git a/Sources/BowlingEF/Context/BowlingContext.cs b/Sources/BowlingEF/Context/BowlingContext.cs new file mode 100644 index 0000000..b957215 --- /dev/null +++ b/Sources/BowlingEF/Context/BowlingContext.cs @@ -0,0 +1,24 @@ +using BowlingEF.Entities; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BowlingEF.Context +{ + public class BowlingContext : DbContext + { + public DbSet Joueurs { get; set; } + public DbSet Equipes { get; set; } + public DbSet Parties { get; set; } + public DbSet Frames { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlite("Data Source=bowling.db"); + } + + } +} diff --git a/Sources/BowlingEF/Entities/EquipeEntity.cs b/Sources/BowlingEF/Entities/EquipeEntity.cs index 44a6789..1854c3d 100644 --- a/Sources/BowlingEF/Entities/EquipeEntity.cs +++ b/Sources/BowlingEF/Entities/EquipeEntity.cs @@ -6,12 +6,14 @@ using System.Threading.Tasks; namespace BowlingEF.Entities { - //classe EquipeEntity représentant la table Equipe de la base de données + /// + /// Classe de gestion des equipes + /// public class EquipeEntity { public long Id { get; set; } public string Nom { get; set; } - public List Joueurs { get; set; } + public ICollection Joueurs { get; set; } public EquipeEntity() { Joueurs = new List(); diff --git a/Sources/BowlingEF/Entities/FrameEntity.cs b/Sources/BowlingEF/Entities/FrameEntity.cs new file mode 100644 index 0000000..2d45d46 --- /dev/null +++ b/Sources/BowlingEF/Entities/FrameEntity.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace BowlingEF.Entities +{ + /// + /// Classe de gestion des frames + /// + public class FrameEntity + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + [Required] + public int Numero { get; set; } + [Required] + public int Lancer1 { get; set; } + [Required] + public int Lancer2 { get; set; } + public int Lancer3 { get; set; } + [Required] + public bool IsStrike { get; set; } + [Required] + public bool IsSpare { get; set; } + public PartieEntity Partie { get; set; } + } +} \ No newline at end of file diff --git a/Sources/BowlingEF/Entities/JoueurEntity.cs b/Sources/BowlingEF/Entities/JoueurEntity.cs index 1fdffdc..fb12d5d 100644 --- a/Sources/BowlingEF/Entities/JoueurEntity.cs +++ b/Sources/BowlingEF/Entities/JoueurEntity.cs @@ -1,6 +1,18 @@ -namespace BowlingEF.Entities +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace BowlingEF.Entities { + /// + /// Classe de gestion des Joueurs + /// public class JoueurEntity { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + + [Required] + public string Pseudo { get; set; } } } \ No newline at end of file diff --git a/Sources/BowlingEF/Entities/PartieEntity.cs b/Sources/BowlingEF/Entities/PartieEntity.cs new file mode 100644 index 0000000..4c7e4f1 --- /dev/null +++ b/Sources/BowlingEF/Entities/PartieEntity.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BowlingEF.Entities +{ + /// + /// Classe de gestion des parties + /// + public class PartieEntity + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long Id { get; set; } + public JoueurEntity Joueur { get; set; } + public ICollection Frames { get; set; } + public int Score { get; set; } + + public PartieEntity() + { + Frames = new List(); + } + } +} diff --git a/Sources/BowlingEF/Migrations/20221015045144_migration001.Designer.cs b/Sources/BowlingEF/Migrations/20221015045144_migration001.Designer.cs new file mode 100644 index 0000000..08517d8 --- /dev/null +++ b/Sources/BowlingEF/Migrations/20221015045144_migration001.Designer.cs @@ -0,0 +1,151 @@ +// +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("20221015045144_migration001")] + partial class migration001 + { + 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("IsSpare") + .HasColumnType("INTEGER"); + + b.Property("IsStrike") + .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("JoueurId") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("JoueurId"); + + 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() + .HasForeignKey("JoueurId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Joueur"); + }); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Navigation("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Navigation("Frames"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/BowlingEF/Migrations/20221015045144_migration001.cs b/Sources/BowlingEF/Migrations/20221015045144_migration001.cs new file mode 100644 index 0000000..069c863 --- /dev/null +++ b/Sources/BowlingEF/Migrations/20221015045144_migration001.cs @@ -0,0 +1,119 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace BowlingEF.Migrations +{ + public partial class migration001 : 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), + JoueurId = table.Column(type: "INTEGER", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Parties", x => x.Id); + table.ForeignKey( + name: "FK_Parties_Joueurs_JoueurId", + column: x => x.JoueurId, + 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), + IsStrike = table.Column(type: "INTEGER", nullable: false), + IsSpare = 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_JoueurId", + table: "Parties", + column: "JoueurId"); + } + + 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..701210b --- /dev/null +++ b/Sources/BowlingEF/Migrations/BowlingContextModelSnapshot.cs @@ -0,0 +1,149 @@ +// +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("IsSpare") + .HasColumnType("INTEGER"); + + b.Property("IsStrike") + .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("JoueurId") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("JoueurId"); + + 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() + .HasForeignKey("JoueurId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Joueur"); + }); + + modelBuilder.Entity("BowlingEF.Entities.EquipeEntity", b => + { + b.Navigation("Joueurs"); + }); + + modelBuilder.Entity("BowlingEF.Entities.PartieEntity", b => + { + b.Navigation("Frames"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/BowlingLib/Model/Equipe.cs b/Sources/BowlingLib/Model/Equipe.cs index 910212f..4bc907c 100644 --- a/Sources/BowlingLib/Model/Equipe.cs +++ b/Sources/BowlingLib/Model/Equipe.cs @@ -12,6 +12,7 @@ namespace BowlingLib.Model { private string nom; private readonly long id; + public List Joueurs = new List(); diff --git a/Sources/BowlingLib/Model/Frame.cs b/Sources/BowlingLib/Model/Frame.cs index 675ec3a..6e4d5e8 100644 --- a/Sources/BowlingLib/Model/Frame.cs +++ b/Sources/BowlingLib/Model/Frame.cs @@ -21,7 +21,7 @@ namespace BowlingLib.Model } private int numero; - private long id; + private readonly long id; public long Id { get { return id; } @@ -126,7 +126,7 @@ namespace BowlingLib.Model this.QuillesTombees = 0; } - public Frame(int numero, long id, int quillesRestantes, int quillesTombees, bool isStrike, bool isSpare, bool isPark, bool isFinished, Lancer lancer1, Lancer lancer2, Lancer lancer3) : this(numero) + public Frame(int numero, long id, int quillesRestantes, int quillesTombees, bool isStrike, bool isSpare, bool isPark, bool isFinished, Lancer lancer1, Lancer lancer2, Lancer? lancer3) : this(numero) { this.id = id; QuillesRestantes = quillesRestantes; diff --git a/Sources/BowlingLib/Model/Joueur.cs b/Sources/BowlingLib/Model/Joueur.cs index a3b0a79..6f7ef91 100644 --- a/Sources/BowlingLib/Model/Joueur.cs +++ b/Sources/BowlingLib/Model/Joueur.cs @@ -48,7 +48,7 @@ namespace BowlingLib.Model public override int GetHashCode() { - return HashCode.Combine(pseudo, id, Id, Pseudo); + return HashCode.Combine(id, Id, Pseudo); } } } diff --git a/Sources/BowlingMaping/BowlingMaping.csproj b/Sources/BowlingMaping/BowlingMaping.csproj new file mode 100644 index 0000000..1f3a5a5 --- /dev/null +++ b/Sources/BowlingMaping/BowlingMaping.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + enable + enable + + + + + + + + diff --git a/Sources/BowlingMaping/DbDataManager.cs b/Sources/BowlingMaping/DbDataManager.cs new file mode 100644 index 0000000..a3641cd --- /dev/null +++ b/Sources/BowlingMaping/DbDataManager.cs @@ -0,0 +1,38 @@ +using BowlingEF.Context; +using Business; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BowlingMaping +{ + //public class DbDataManager : IDataManager + //{ + // private readonly BowlingContext context; + + // public DbDataManager(BowlingContext context) + // { + // this.context = context; + // } + + // public void Add(Manager data) + // { + // context.Add(data); + // context.SaveChanges(); + // } + + // public void Delete(Manager data) + // { + // context.Remove(data); + // context.SaveChanges(); + // } + + // public void Update(Manager data) + // { + // context.Update(data); + // context.SaveChanges(); + // } + //} +} diff --git a/Sources/Solution.sln b/Sources/Solution.sln index 52c5fe7..2cb5ded 100644 --- a/Sources/Solution.sln +++ b/Sources/Solution.sln @@ -13,9 +13,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingAppUnitTest", "Tests EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingStub", "BowlingStub\BowlingStub.csproj", "{B50615A5-ABFD-4A9C-B236-DBAEDE62AB2E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Business", "Business\Business.csproj", "{4F0C1B08-1DB7-4424-9521-EB13A858D09B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Business", "Business\Business.csproj", "{4F0C1B08-1DB7-4424-9521-EB13A858D09B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingEF", "BowlingEF\BowlingEF.csproj", "{1E42224B-45E4-433C-9D20-0A61023790ED}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingEF", "BowlingEF\BowlingEF.csproj", "{1E42224B-45E4-433C-9D20-0A61023790ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingMaping", "BowlingMaping\BowlingMaping.csproj", "{874DDEF3-1FDA-4ECE-826F-F67143823544}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -47,6 +49,10 @@ Global {1E42224B-45E4-433C-9D20-0A61023790ED}.Debug|Any CPU.Build.0 = Debug|Any CPU {1E42224B-45E4-433C-9D20-0A61023790ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E42224B-45E4-433C-9D20-0A61023790ED}.Release|Any CPU.Build.0 = Release|Any CPU + {874DDEF3-1FDA-4ECE-826F-F67143823544}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {874DDEF3-1FDA-4ECE-826F-F67143823544}.Debug|Any CPU.Build.0 = Debug|Any CPU + {874DDEF3-1FDA-4ECE-826F-F67143823544}.Release|Any CPU.ActiveCfg = Release|Any CPU + {874DDEF3-1FDA-4ECE-826F-F67143823544}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE