From cf5d5bd695720a586399ba0cf7ad4c1e9dc3bd02 Mon Sep 17 00:00:00 2001 From: Maxence Lanone Date: Tue, 11 Apr 2023 13:19:51 +0200 Subject: [PATCH] =?UTF-8?q?:zap:=20ajout=20m=C3=A9thodes=20player=20manage?= =?UTF-8?q?r=20(pas=20tester=20mais=20coder)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/DbDataManager/DbDataManager.cs | 2 +- Sources/DbDataManager/DbDataManager.csproj | 7 + Sources/DbDataManager/Extensions.cs | 67 +++++++++ Sources/DbDataManager/Mapper/PlayerMapper.cs | 30 ++++ Sources/DbDataManager/Mapper/StatsMapper.cs | 40 ++++++ Sources/DbDataManager/PlayersManager.cs | 85 ++++++++++++ Sources/Stub/Stub/StubData.cs | 5 - Sources/Trek12_API.sln | 18 ++- ...=> 20230411093944_MyMigration.Designer.cs} | 120 ++++++++++++---- ...tions.cs => 20230411093944_MyMigration.cs} | 131 ++++++++++++------ .../Migrations/TrekContextModelSnapshot.cs | 116 ++++++++++++---- Sources/Trek12_Lib/PlayerEntity.cs | 5 +- Sources/Trek12_Lib/StatsEntity.cs | 17 +++ Sources/Trek12_Lib/TrekContext.cs | 9 +- Sources/Trek12_Lib/projet.AllTables.db | Bin 49152 -> 65536 bytes Sources/Trek12_Lib/projet.AllTables.db-shm | Bin 0 -> 32768 bytes Sources/Trek12_Lib/projet.AllTables.db-wal | 0 17 files changed, 542 insertions(+), 110 deletions(-) create mode 100644 Sources/DbDataManager/Extensions.cs create mode 100644 Sources/DbDataManager/Mapper/PlayerMapper.cs create mode 100644 Sources/DbDataManager/Mapper/StatsMapper.cs create mode 100644 Sources/DbDataManager/PlayersManager.cs rename Sources/Trek12_Lib/Migrations/{20230320170231_AllMigrations.Designer.cs => 20230411093944_MyMigration.Designer.cs} (64%) rename Sources/Trek12_Lib/Migrations/{20230320170231_AllMigrations.cs => 20230411093944_MyMigration.cs} (70%) create mode 100644 Sources/Trek12_Lib/StatsEntity.cs create mode 100644 Sources/Trek12_Lib/projet.AllTables.db-shm create mode 100644 Sources/Trek12_Lib/projet.AllTables.db-wal diff --git a/Sources/DbDataManager/DbDataManager.cs b/Sources/DbDataManager/DbDataManager.cs index 189eeb3..60ba046 100644 --- a/Sources/DbDataManager/DbDataManager.cs +++ b/Sources/DbDataManager/DbDataManager.cs @@ -3,7 +3,7 @@ namespace DbDataManager; public class DbDataManager : IDataManager { - public IPlayersManager PlayersMgr => throw new NotImplementedException(); + public IPlayersManager PlayersMgr => new PlayersManager(); public IGamesManager GamesMgr => throw new NotImplementedException(); diff --git a/Sources/DbDataManager/DbDataManager.csproj b/Sources/DbDataManager/DbDataManager.csproj index f05027c..bd1898f 100644 --- a/Sources/DbDataManager/DbDataManager.csproj +++ b/Sources/DbDataManager/DbDataManager.csproj @@ -8,5 +8,12 @@ + + + + + + + diff --git a/Sources/DbDataManager/Extensions.cs b/Sources/DbDataManager/Extensions.cs new file mode 100644 index 0000000..894eedc --- /dev/null +++ b/Sources/DbDataManager/Extensions.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DbDataManager +{ + static class Extensions + { + internal static Task> GetItemsWithFilterAndOrdering(this IEnumerable collection, + Func filter, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + IEnumerable temp = collection; + temp = temp.Where(item => filter(item)); + if (orderingPropertyName != null) + { + var prop = typeof(T).GetProperty(orderingPropertyName!); + if (prop != null) + { + temp = descending ? temp.OrderByDescending(item => prop.GetValue(item)) + : temp.OrderBy(item => prop.GetValue(item)); + } + } + return Task.FromResult>(temp.Skip(index * count).Take(count)); + } + + internal static Task GetNbItemsWithFilter(this IEnumerable collection, Func filter) + { + return Task.FromResult(collection.Count(item => filter(item))); + } + + internal static Task AddItem(this IList collection, T? item) + { + if (item == null || collection.Contains(item)) + { + return Task.FromResult(default(T)); + } + collection.Add(item); + return Task.FromResult(item); + } + + internal static Task DeleteItem(this IList collection, T? item) + { + if (item == null) + { + return Task.FromResult(false); + } + bool result = collection.Remove(item!); + return Task.FromResult(result); + } + + internal static Task UpdateItem(this IList collection, T? oldItem, T? newItem) + { + if (oldItem == null || newItem == null) return Task.FromResult(default(T)); + + if (!collection.Contains(oldItem)) + { + return Task.FromResult(default(T)); + } + + collection.Remove(oldItem!); + collection.Add(newItem!); + return Task.FromResult(newItem); + } + } +} diff --git a/Sources/DbDataManager/Mapper/PlayerMapper.cs b/Sources/DbDataManager/Mapper/PlayerMapper.cs new file mode 100644 index 0000000..82ddac4 --- /dev/null +++ b/Sources/DbDataManager/Mapper/PlayerMapper.cs @@ -0,0 +1,30 @@ +using System; +using EntityFrameWorkLib; +using Model; + +namespace DbDataManager.Mapper +{ + public static class PlayerMapper + { + public static Player ToModel(this PlayerEntity playerEntity) + { + Player player = new Player(playerEntity.Pseudo, playerEntity.stats.ToModel(), playerEntity.PlayerId); + return player; + } + + public static PlayerEntity ToEntity(this Player playerModel) + { + PlayerEntity player = new PlayerEntity + { + PlayerId = playerModel.Id, + Pseudo = playerModel.Pseudo, + stats = playerModel.Stats.ToEntity(), + + }; + player.stats.PlayerId = playerModel.Id; + return player; + } + + } +} + diff --git a/Sources/DbDataManager/Mapper/StatsMapper.cs b/Sources/DbDataManager/Mapper/StatsMapper.cs new file mode 100644 index 0000000..a2dc6af --- /dev/null +++ b/Sources/DbDataManager/Mapper/StatsMapper.cs @@ -0,0 +1,40 @@ +using System; +using EntityFrameWorkLib; +using Model; + +namespace DbDataManager.Mapper +{ + public static class StatsMapper + { + public static Stats ToModel(this StatsEntity statsEntity) + { + var stats = new Stats + { + Id = statsEntity.Id, + NbWin = statsEntity.NbWin, + NbPlayed = statsEntity.NbPlayed, + MaxZone = statsEntity.MaxZone, + MaxChain = statsEntity.MaxChain, + MaxPoints = statsEntity.MaxPoints + }; + return stats; + } + + public static StatsEntity ToEntity(this Stats statsModel) + { + var stats = new StatsEntity + { + Id = statsModel.Id, + MaxChain = statsModel.MaxChain, + MaxPoints = statsModel.MaxPoints, + MaxZone = statsModel.MaxZone, + NbPlayed = statsModel.NbPlayed, + NbWin = statsModel.NbWin, + + }; + return stats; + } + + } +} + diff --git a/Sources/DbDataManager/PlayersManager.cs b/Sources/DbDataManager/PlayersManager.cs new file mode 100644 index 0000000..07efefd --- /dev/null +++ b/Sources/DbDataManager/PlayersManager.cs @@ -0,0 +1,85 @@ +using System; +using EntityFrameWorkLib; +using Model; +using DbDataManager.Mapper; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.Data.SqlTypes; + +namespace DbDataManager +{ + public class PlayersManager : IPlayersManager + { + private TrekContext trekContext; + + public async Task AddItem(Player? item) + { + if (item == null) + { + return null; + + } + var player = await trekContext.AddAsync(item); + await trekContext.SaveChangesAsync(); + return player.Entity; + } + public async Task DeleteItem(Player? item) + { + if (item == null) + { + return false; + } + var deleteItem = trekContext.Remove(item); + await trekContext.SaveChangesAsync(); + return true; + } + + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + + IEnumerable players = trekContext.Players.Skip(index * count) + .Take(count) + .OrderBy(players => orderingPropertyName) + .Select(players => players.ToModel()); + + return players; + } + public Task> GetItemsById(int id) + { + return trekContext.Players.Select(player => player.ToModel()).GetItemsWithFilterAndOrdering(player => filterById(player, id),0,1); + } + private Func filterById = (player, id) => player.Id.Equals(id); + + + public Task> GetItemsByPseudo(string charPseudo) + { + return trekContext.Players.Select(player => player.ToModel()).GetItemsWithFilterAndOrdering(player => filterByPseudo(player, charPseudo), 0, trekContext.Players.Count()); + } + private Func filterByPseudo = (player, substring) => player.Pseudo.Contains(substring, StringComparison.InvariantCultureIgnoreCase); + + + public Task GetNbItems() + { + return Task.FromResult(trekContext.Players.Count()); + } + + public Task GetNbItemsByPseudo(string charPseudo) + { + return trekContext.Players.Select(player => player.ToModel()).GetNbItemsWithFilter(player => filterByPseudo(player, charPseudo)); + } + + public Task UpdateItem(Player? oldItem, Player? newItem) + { + if (oldItem == null || newItem == null) return Task.FromResult(default(Player)); + + if (!trekContext.Players.Select(player => player.ToModel()).Contains(oldItem)) + { + return Task.FromResult(default(Player)); + } + + trekContext.Players.Remove(oldItem!.ToEntity()); + trekContext.Players.AddAsync(newItem!.ToEntity()); + return Task.FromResult(newItem); + } + } +} + diff --git a/Sources/Stub/Stub/StubData.cs b/Sources/Stub/Stub/StubData.cs index e492098..d3e32db 100644 --- a/Sources/Stub/Stub/StubData.cs +++ b/Sources/Stub/Stub/StubData.cs @@ -6,11 +6,6 @@ namespace Stub { public StubData() { - //ChampionsMgr = new ChampionsManager(this); - //SkinsMgr = new SkinsManager(this); - //RunesMgr = new RunesManager(this); - //RunePagesMgr = new RunePagesManager(this); - PlayersMgr = new PlayersManager(this); GamesMgr = new GamesManager(this); GamesModeMgr = new GamesModeManager(this); diff --git a/Sources/Trek12_API.sln b/Sources/Trek12_API.sln index 527b156..025e37a 100644 --- a/Sources/Trek12_API.sln +++ b/Sources/Trek12_API.sln @@ -23,7 +23,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csp EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Stub", "Tests\Test_Stub\Test_Stub.csproj", "{5A1D87FF-E82F-43FF-AC5C-59659B91D5B8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_Model", "Tests\Test_Model\Test_Model.csproj", "{593766AA-8E2A-4B3D-A299-8E45F5C19C18}" +Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "Test_Model", "Tests\Test_Model\Test_Model.csproj", "{CFA6848A-2A65-49CA-BE0B-3759F52B85E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbDataManager", "DbDataManager\DbDataManager.csproj", "{57F6555B-462D-4ED1-89C9-495EC7111218}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -63,10 +65,14 @@ Global {5A1D87FF-E82F-43FF-AC5C-59659B91D5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A1D87FF-E82F-43FF-AC5C-59659B91D5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A1D87FF-E82F-43FF-AC5C-59659B91D5B8}.Release|Any CPU.Build.0 = Release|Any CPU - {593766AA-8E2A-4B3D-A299-8E45F5C19C18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {593766AA-8E2A-4B3D-A299-8E45F5C19C18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {593766AA-8E2A-4B3D-A299-8E45F5C19C18}.Release|Any CPU.ActiveCfg = Release|Any CPU - {593766AA-8E2A-4B3D-A299-8E45F5C19C18}.Release|Any CPU.Build.0 = Release|Any CPU + {CFA6848A-2A65-49CA-BE0B-3759F52B85E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFA6848A-2A65-49CA-BE0B-3759F52B85E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFA6848A-2A65-49CA-BE0B-3759F52B85E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFA6848A-2A65-49CA-BE0B-3759F52B85E3}.Release|Any CPU.Build.0 = Release|Any CPU + {57F6555B-462D-4ED1-89C9-495EC7111218}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57F6555B-462D-4ED1-89C9-495EC7111218}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57F6555B-462D-4ED1-89C9-495EC7111218}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57F6555B-462D-4ED1-89C9-495EC7111218}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -76,7 +82,7 @@ Global {6EC6383D-10E8-44E1-8EDD-EF4DF460A9B1} = {C75DF644-C41F-4A08-8B69-C8554204AC72} {5E45E953-4FCC-42B6-9F22-15108D002D78} = {B1585816-FCBB-484F-A1AA-C7AEB501C39B} {5A1D87FF-E82F-43FF-AC5C-59659B91D5B8} = {C75DF644-C41F-4A08-8B69-C8554204AC72} - {593766AA-8E2A-4B3D-A299-8E45F5C19C18} = {C75DF644-C41F-4A08-8B69-C8554204AC72} + {CFA6848A-2A65-49CA-BE0B-3759F52B85E3} = {C75DF644-C41F-4A08-8B69-C8554204AC72} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4D47853B-D1A3-49A5-84BA-CD2DC65FD105} diff --git a/Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.Designer.cs b/Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.Designer.cs similarity index 64% rename from Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.Designer.cs rename to Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.Designer.cs index b99d4b8..2fbf2b8 100644 --- a/Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.Designer.cs +++ b/Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.Designer.cs @@ -11,14 +11,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace EntityFrameWorkLib.Migrations { [DbContext(typeof(TrekContext))] - [Migration("20230320170231_AllMigrations")] - partial class AllMigrations + [Migration("20230411093944_MyMigration")] + partial class MyMigration { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + modelBuilder.HasAnnotation("ProductVersion", "7.0.4"); modelBuilder.Entity("EntityFrameWorkLib.CaseEntity", b => { @@ -26,11 +26,16 @@ namespace EntityFrameWorkLib.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("GrilleId") + .HasColumnType("INTEGER"); + b.Property("Value") .HasColumnType("INTEGER"); b.HasKey("CaseId"); + b.HasIndex("GrilleId"); + b.ToTable("Case"); }); @@ -47,14 +52,18 @@ namespace EntityFrameWorkLib.Migrations .HasColumnType("TEXT"); b.Property("Name") - .IsRequired() .HasColumnType("TEXT"); b.Property("NbPlayers") .HasColumnType("INTEGER"); + b.Property("PlayerId") + .HasColumnType("INTEGER"); + b.HasKey("GameId"); + b.HasIndex("PlayerId"); + b.ToTable("Game"); }); @@ -87,52 +96,62 @@ namespace EntityFrameWorkLib.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("MaxPoints") - .HasColumnType("INTEGER"); + b.Property("Pseudo") + .HasColumnType("TEXT"); - b.Property("MaxZone") - .HasColumnType("INTEGER"); + b.HasKey("PlayerId"); - b.Property("NbPlayed") + b.ToTable("Players"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => + { + b.Property("GameId") .HasColumnType("INTEGER"); - b.Property("NbPoints") + b.Property("PlayerId") .HasColumnType("INTEGER"); - b.Property("NbWin") + b.Property("NbPointsTotal") .HasColumnType("INTEGER"); - b.Property("Pseudo") - .IsRequired() - .HasColumnType("TEXT"); + b.HasKey("GameId", "PlayerId"); - b.HasKey("PlayerId"); + b.HasIndex("PlayerId"); - b.ToTable("Players"); + b.ToTable("Score"); }); - modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => + modelBuilder.Entity("EntityFrameWorkLib.StatsEntity", b => { - b.Property("ScoreId") + b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("GameId") + b.Property("MaxChain") .HasColumnType("INTEGER"); - b.Property("NbPoints") + b.Property("MaxPoints") .HasColumnType("INTEGER"); - b.Property("PlayerId") + b.Property("MaxZone") .HasColumnType("INTEGER"); - b.HasKey("ScoreId"); + b.Property("NbPlayed") + .HasColumnType("INTEGER"); - b.HasIndex("GameId"); + b.Property("NbWin") + .HasColumnType("INTEGER"); - b.HasIndex("PlayerId"); + b.Property("PlayerId") + .HasColumnType("INTEGER"); - b.ToTable("Score"); + b.HasKey("Id"); + + b.HasIndex("PlayerId") + .IsUnique(); + + b.ToTable("Stats"); }); modelBuilder.Entity("EntityFrameWorkLib.TurnEntity", b => @@ -152,10 +171,32 @@ namespace EntityFrameWorkLib.Migrations b.ToTable("Turn"); }); + modelBuilder.Entity("EntityFrameWorkLib.CaseEntity", b => + { + b.HasOne("EntityFrameWorkLib.GrilleEntity", "Grille") + .WithMany("Cases") + .HasForeignKey("GrilleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Grille"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GameEntity", b => + { + b.HasOne("EntityFrameWorkLib.PlayerEntity", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => { b.HasOne("EntityFrameWorkLib.GameEntity", "Game") - .WithMany() + .WithMany("Scores") .HasForeignKey("GameId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -170,6 +211,33 @@ namespace EntityFrameWorkLib.Migrations b.Navigation("Player"); }); + + modelBuilder.Entity("EntityFrameWorkLib.StatsEntity", b => + { + b.HasOne("EntityFrameWorkLib.PlayerEntity", "Player") + .WithOne("stats") + .HasForeignKey("EntityFrameWorkLib.StatsEntity", "PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GameEntity", b => + { + b.Navigation("Scores"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GrilleEntity", b => + { + b.Navigation("Cases"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.PlayerEntity", b => + { + b.Navigation("stats") + .IsRequired(); + }); #pragma warning restore 612, 618 } } diff --git a/Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.cs b/Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.cs similarity index 70% rename from Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.cs rename to Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.cs index 5790c46..64c5ec2 100644 --- a/Sources/Trek12_Lib/Migrations/20230320170231_AllMigrations.cs +++ b/Sources/Trek12_Lib/Migrations/20230411093944_MyMigration.cs @@ -6,101 +6,132 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace EntityFrameWorkLib.Migrations { /// - public partial class AllMigrations : Migration + public partial class MyMigration : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "Case", + name: "Grille", columns: table => new { - CaseId = table.Column(type: "INTEGER", nullable: false) + GrilleId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - Value = table.Column(type: "INTEGER", nullable: false) + NbChains = table.Column(type: "INTEGER", nullable: false), + NbZones = table.Column(type: "INTEGER", nullable: false), + MaxChain = table.Column(type: "INTEGER", nullable: false), + MaxZone = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Case", x => x.CaseId); + table.PrimaryKey("PK_Grille", x => x.GrilleId); }); migrationBuilder.CreateTable( - name: "Game", + name: "Players", columns: table => new { - GameId = table.Column(type: "INTEGER", nullable: false) + PlayerId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - Duration = table.Column(type: "TEXT", nullable: false), - Date = table.Column(type: "TEXT", nullable: false), - NbPlayers = table.Column(type: "INTEGER", nullable: false), - Name = table.Column(type: "TEXT", nullable: false) + Pseudo = table.Column(type: "TEXT", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_Game", x => x.GameId); + table.PrimaryKey("PK_Players", x => x.PlayerId); }); migrationBuilder.CreateTable( - name: "Grille", + name: "Turn", columns: table => new { - GrilleId = table.Column(type: "INTEGER", nullable: false) + TurnId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - NbChains = table.Column(type: "INTEGER", nullable: false), - NbZones = table.Column(type: "INTEGER", nullable: false), - MaxChain = table.Column(type: "INTEGER", nullable: false), - MaxZone = table.Column(type: "INTEGER", nullable: false) + DiceValue1 = table.Column(type: "INTEGER", nullable: false), + DiceValue2 = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Grille", x => x.GrilleId); + table.PrimaryKey("PK_Turn", x => x.TurnId); }); migrationBuilder.CreateTable( - name: "Players", + name: "Case", columns: table => new { - PlayerId = table.Column(type: "INTEGER", nullable: false) + CaseId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - Pseudo = table.Column(type: "TEXT", nullable: false), - NbWin = table.Column(type: "INTEGER", nullable: false), - NbPlayed = table.Column(type: "INTEGER", nullable: false), - MaxZone = table.Column(type: "INTEGER", nullable: false), - MaxPoints = table.Column(type: "INTEGER", nullable: false), - NbPoints = table.Column(type: "INTEGER", nullable: false) + GrilleId = table.Column(type: "INTEGER", nullable: false), + Value = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Players", x => x.PlayerId); + table.PrimaryKey("PK_Case", x => x.CaseId); + table.ForeignKey( + name: "FK_Case_Grille_GrilleId", + column: x => x.GrilleId, + principalTable: "Grille", + principalColumn: "GrilleId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Turn", + name: "Game", columns: table => new { - TurnId = table.Column(type: "INTEGER", nullable: false) + GameId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - DiceValue1 = table.Column(type: "INTEGER", nullable: false), - DiceValue2 = table.Column(type: "INTEGER", nullable: false) + Duration = table.Column(type: "TEXT", nullable: false), + Date = table.Column(type: "TEXT", nullable: false), + NbPlayers = table.Column(type: "INTEGER", nullable: false), + PlayerId = table.Column(type: "INTEGER", nullable: false), + Name = table.Column(type: "TEXT", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_Turn", x => x.TurnId); + table.PrimaryKey("PK_Game", x => x.GameId); + table.ForeignKey( + name: "FK_Game_Players_PlayerId", + column: x => x.PlayerId, + principalTable: "Players", + principalColumn: "PlayerId", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Score", + name: "Stats", columns: table => new { - ScoreId = table.Column(type: "INTEGER", nullable: false) + Id = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - NbPoints = table.Column(type: "INTEGER", nullable: false), - GameId = table.Column(type: "INTEGER", nullable: false), + NbWin = table.Column(type: "INTEGER", nullable: false), + NbPlayed = table.Column(type: "INTEGER", nullable: false), + MaxChain = table.Column(type: "INTEGER", nullable: false), + MaxZone = table.Column(type: "INTEGER", nullable: false), + MaxPoints = table.Column(type: "INTEGER", nullable: false), PlayerId = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Score", x => x.ScoreId); + table.PrimaryKey("PK_Stats", x => x.Id); + table.ForeignKey( + name: "FK_Stats_Players_PlayerId", + column: x => x.PlayerId, + principalTable: "Players", + principalColumn: "PlayerId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Score", + columns: table => new + { + GameId = table.Column(type: "INTEGER", nullable: false), + PlayerId = table.Column(type: "INTEGER", nullable: false), + NbPointsTotal = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Score", x => new { x.GameId, x.PlayerId }); table.ForeignKey( name: "FK_Score_Game_GameId", column: x => x.GameId, @@ -116,14 +147,25 @@ namespace EntityFrameWorkLib.Migrations }); migrationBuilder.CreateIndex( - name: "IX_Score_GameId", - table: "Score", - column: "GameId"); + name: "IX_Case_GrilleId", + table: "Case", + column: "GrilleId"); + + migrationBuilder.CreateIndex( + name: "IX_Game_PlayerId", + table: "Game", + column: "PlayerId"); migrationBuilder.CreateIndex( name: "IX_Score_PlayerId", table: "Score", column: "PlayerId"); + + migrationBuilder.CreateIndex( + name: "IX_Stats_PlayerId", + table: "Stats", + column: "PlayerId", + unique: true); } /// @@ -133,14 +175,17 @@ namespace EntityFrameWorkLib.Migrations name: "Case"); migrationBuilder.DropTable( - name: "Grille"); + name: "Score"); migrationBuilder.DropTable( - name: "Score"); + name: "Stats"); migrationBuilder.DropTable( name: "Turn"); + migrationBuilder.DropTable( + name: "Grille"); + migrationBuilder.DropTable( name: "Game"); diff --git a/Sources/Trek12_Lib/Migrations/TrekContextModelSnapshot.cs b/Sources/Trek12_Lib/Migrations/TrekContextModelSnapshot.cs index c577c75..8fe9309 100644 --- a/Sources/Trek12_Lib/Migrations/TrekContextModelSnapshot.cs +++ b/Sources/Trek12_Lib/Migrations/TrekContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace EntityFrameWorkLib.Migrations protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + modelBuilder.HasAnnotation("ProductVersion", "7.0.4"); modelBuilder.Entity("EntityFrameWorkLib.CaseEntity", b => { @@ -23,11 +23,16 @@ namespace EntityFrameWorkLib.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("GrilleId") + .HasColumnType("INTEGER"); + b.Property("Value") .HasColumnType("INTEGER"); b.HasKey("CaseId"); + b.HasIndex("GrilleId"); + b.ToTable("Case"); }); @@ -44,14 +49,18 @@ namespace EntityFrameWorkLib.Migrations .HasColumnType("TEXT"); b.Property("Name") - .IsRequired() .HasColumnType("TEXT"); b.Property("NbPlayers") .HasColumnType("INTEGER"); + b.Property("PlayerId") + .HasColumnType("INTEGER"); + b.HasKey("GameId"); + b.HasIndex("PlayerId"); + b.ToTable("Game"); }); @@ -84,52 +93,62 @@ namespace EntityFrameWorkLib.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("MaxPoints") - .HasColumnType("INTEGER"); + b.Property("Pseudo") + .HasColumnType("TEXT"); - b.Property("MaxZone") - .HasColumnType("INTEGER"); + b.HasKey("PlayerId"); - b.Property("NbPlayed") + b.ToTable("Players"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => + { + b.Property("GameId") .HasColumnType("INTEGER"); - b.Property("NbPoints") + b.Property("PlayerId") .HasColumnType("INTEGER"); - b.Property("NbWin") + b.Property("NbPointsTotal") .HasColumnType("INTEGER"); - b.Property("Pseudo") - .IsRequired() - .HasColumnType("TEXT"); + b.HasKey("GameId", "PlayerId"); - b.HasKey("PlayerId"); + b.HasIndex("PlayerId"); - b.ToTable("Players"); + b.ToTable("Score"); }); - modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => + modelBuilder.Entity("EntityFrameWorkLib.StatsEntity", b => { - b.Property("ScoreId") + b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("GameId") + b.Property("MaxChain") .HasColumnType("INTEGER"); - b.Property("NbPoints") + b.Property("MaxPoints") .HasColumnType("INTEGER"); - b.Property("PlayerId") + b.Property("MaxZone") .HasColumnType("INTEGER"); - b.HasKey("ScoreId"); + b.Property("NbPlayed") + .HasColumnType("INTEGER"); - b.HasIndex("GameId"); + b.Property("NbWin") + .HasColumnType("INTEGER"); - b.HasIndex("PlayerId"); + b.Property("PlayerId") + .HasColumnType("INTEGER"); - b.ToTable("Score"); + b.HasKey("Id"); + + b.HasIndex("PlayerId") + .IsUnique(); + + b.ToTable("Stats"); }); modelBuilder.Entity("EntityFrameWorkLib.TurnEntity", b => @@ -149,10 +168,32 @@ namespace EntityFrameWorkLib.Migrations b.ToTable("Turn"); }); + modelBuilder.Entity("EntityFrameWorkLib.CaseEntity", b => + { + b.HasOne("EntityFrameWorkLib.GrilleEntity", "Grille") + .WithMany("Cases") + .HasForeignKey("GrilleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Grille"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GameEntity", b => + { + b.HasOne("EntityFrameWorkLib.PlayerEntity", "Player") + .WithMany() + .HasForeignKey("PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + modelBuilder.Entity("EntityFrameWorkLib.ScoreEntity", b => { b.HasOne("EntityFrameWorkLib.GameEntity", "Game") - .WithMany() + .WithMany("Scores") .HasForeignKey("GameId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -167,6 +208,33 @@ namespace EntityFrameWorkLib.Migrations b.Navigation("Player"); }); + + modelBuilder.Entity("EntityFrameWorkLib.StatsEntity", b => + { + b.HasOne("EntityFrameWorkLib.PlayerEntity", "Player") + .WithOne("stats") + .HasForeignKey("EntityFrameWorkLib.StatsEntity", "PlayerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GameEntity", b => + { + b.Navigation("Scores"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.GrilleEntity", b => + { + b.Navigation("Cases"); + }); + + modelBuilder.Entity("EntityFrameWorkLib.PlayerEntity", b => + { + b.Navigation("stats") + .IsRequired(); + }); #pragma warning restore 612, 618 } } diff --git a/Sources/Trek12_Lib/PlayerEntity.cs b/Sources/Trek12_Lib/PlayerEntity.cs index 62cc19d..1b947c3 100644 --- a/Sources/Trek12_Lib/PlayerEntity.cs +++ b/Sources/Trek12_Lib/PlayerEntity.cs @@ -10,10 +10,7 @@ namespace EntityFrameWorkLib [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int PlayerId { get; set; } public string? Pseudo { get; set; } - public int NbWin { get; set; } - public int NbPlayed { get; set; } - public int MaxZone { get; set; } - public int MaxPoints { get; set; } + public StatsEntity stats { get; set; } } } diff --git a/Sources/Trek12_Lib/StatsEntity.cs b/Sources/Trek12_Lib/StatsEntity.cs new file mode 100644 index 0000000..569d4f7 --- /dev/null +++ b/Sources/Trek12_Lib/StatsEntity.cs @@ -0,0 +1,17 @@ +using System; +namespace EntityFrameWorkLib +{ + public class StatsEntity + { + public int Id { get; set; } + public int NbWin { get; set; } + public int NbPlayed { get; set; } + public int MaxChain { get; set; } + public int MaxZone { get; set; } + public int MaxPoints { get; set; } + + public int PlayerId { get; set; } + public PlayerEntity Player { get; set; } + } +} + diff --git a/Sources/Trek12_Lib/TrekContext.cs b/Sources/Trek12_Lib/TrekContext.cs index 33c88bc..4661400 100644 --- a/Sources/Trek12_Lib/TrekContext.cs +++ b/Sources/Trek12_Lib/TrekContext.cs @@ -20,6 +20,8 @@ namespace EntityFrameWorkLib public DbSet Score { get; set; } + public DbSet Stats { get; set; } + public TrekContext() { } public TrekContext(DbContextOptions options) : base(options) @@ -78,8 +80,13 @@ namespace EntityFrameWorkLib .WithOne(c => c.Grille) .HasForeignKey(c => c.GrilleId); + modelBuilder.Entity() //l'entité Player... + .HasOne(n => n.stats) //a une propriété obligatoire stats... + .WithOne(c => c.Player) //reliée à la propriété Player de Stats... + .HasForeignKey(c => c.PlayerId);//dont la propriété Id est une Foreign Key + //Configuration des clés primaires et étrangères pour la table Participate - + base.OnModelCreating(modelBuilder); } diff --git a/Sources/Trek12_Lib/projet.AllTables.db b/Sources/Trek12_Lib/projet.AllTables.db index 1dcbc420cb6bf652282f9816e0c17d4edbe49560..cf51b30e92851e48e1adffb61e31be7798f13c7d 100644 GIT binary patch delta 1331 zcmZ`(&rj1}7+&2**REY>WK=-eN8!NCgz-axgF%Es%8!EESWpvdVFibS=~fbniNf&L zQSzR=7(=`eL!$BE&5I{vyqK71!a+FrC#Xli@9PFkW3z9~_w{|>=Xsy!ZC6*_tE-+T zVKL}BxP*=9*_K&GlzzJ;Pr?=WB5jMG#5=+_LFRvOCcEW*&))Uk@E-HL^(0$)?BgjTAJ>H197!KsiG-eyEvsHO&?UJk@8Qhf+lpN z&T8Y_Q-ud&Fh$j0l zjH$SB@&Kp8GhZ0q`5I602w#dmGnvaQ*@a}zHnR#AFR2czaimWqkv=sx79~+I;%kyI zCT>bgD^YYvyC{73E#g%N*SV{+d?ezplF!MEi^^BHmCe|eVJ_Pk0^4U$4n{k@3F~J# zhq&etC&p5D_`isg2bj3S7Z|?TOT)nMoq%qC1ElK!>qmU7911ZH<|!KKg)FWTtK=Kjr~x+}1WiP+AU4!F*n_5x6-=trSevpw@Is_` zH6=Nz@lFVl57Vf2{KKh(ll%Ykl-9S=HtWa zF!cv1DKoo_sr};~fgdFmN~5+vaS9rmh^yMLjz-l>74wAR>W~^&^#L`3N@I2~aPW$& zspBJSeO0uLqDk9GF6WoXVqupH!7omSA-)L~cm?6mu$PtV>zQJRhB|Lup>(T)ZT>iR zi%eJ$e)3JS)8J&mT2AN6Qez!qS4{R5y>3>nt!36N$3pt@I9hlr1#}MgXJ%ioW*86@ zn8UO3SU}~O5irRqhLyX!nW6?effRH~33wzm!At3iXU8S&yg3^CEVU|(yI<~zb#%tM z+S_BjoxNRM#`wy3WaMIn+{Xb1b}Y< delta 993 zcmaJ=&rcIU6z0%}}!$d_5$I zfwRHAN#1~^ge3nC2w*l4`6eGkrlgaJayu^!vG3f&9YMLlEcFlXG>i%>mxMTPSQROv+(UQ^qC z>gaZ!1B#+BFP^ShWyhxH)bM^ZGjl7iW5-@Xhdm`8;?WL-j=>dF3tvKCxCrMT7-e+8 z#u*9iaDzQb3CR*9%R8YD?T7DUob38RWkBLbH?u5IVlif`O3BTJTO*T0*TtCN$0Gpd z89}ZHvG-f?GPWN?^(OY;ngc)?7+{{SQvU_V+OS>EU)b&he3WE>H5IP<;TJr+QK_rY z)QcuG=JC9n&nG*%+(UIXCU-t*kP2F5dm}zJXRR;SYc_$fu02-mszZO8s1(9LiN~4k zw#pf|>Ns}Wf^Lm%kV>=!h+rgjMxA|RRcqeg)JB;wQwUS9u)}w{HL180OnpXQ?BqpC z?p>fI-_FsJkv1SRd`<|4sEi%Xz_E|GL2OUC1h##=il2`5fI)9{RZc=1k~zJZ2)5r< zp(I($v&jr~lMv{vp~x3~=ZpZye1av*Y2YjWN~6dCC7our=FxFv3Co(23)sGtNq6ka z4?>3l`LGp*UuA8C3F=BpOHFE%DQzN+Hxs3d