From 3da8ab952aa5b7aaa253b1568a33a305e2c2f4f2 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Sat, 25 Mar 2023 16:29:35 +0100 Subject: [PATCH 1/2] :zap: Ajout des liaisons One to many pour champion et skill, et pour runepage et rune, migration fonctionnel avec comme context le loldbcontext, mais pas avec le stubbed --- Sources/EntityFramework/LoLDbContext.cs | 48 +++- .../20230325150121_MigrSkill.Designer.cs | 225 ++++++++++++++++++ .../Migrations/20230325150121_MigrSkill.cs | 197 +++++++++++++++ .../Migrations/LoLDbContextModelSnapshot.cs | 222 +++++++++++++++++ Sources/EntityFramework/Program.cs | 167 +++++++------ Sources/EntityFramework/RuneEntity.cs | 4 + Sources/EntityFramework/RunePageEntity.cs | 9 +- Sources/EntityFramework/SkillEntity.cs | 4 + Sources/EntityFramework/SkinEntity.cs | 4 +- Sources/EntityFramework/StubbedContext.cs | 33 +++ Sources/EntityFramework/champion.db | Bin 0 -> 90112 bytes 11 files changed, 831 insertions(+), 82 deletions(-) create mode 100644 Sources/EntityFramework/Migrations/20230325150121_MigrSkill.Designer.cs create mode 100644 Sources/EntityFramework/Migrations/20230325150121_MigrSkill.cs create mode 100644 Sources/EntityFramework/Migrations/LoLDbContextModelSnapshot.cs create mode 100644 Sources/EntityFramework/champion.db diff --git a/Sources/EntityFramework/LoLDbContext.cs b/Sources/EntityFramework/LoLDbContext.cs index 042b646..8dbfbb0 100644 --- a/Sources/EntityFramework/LoLDbContext.cs +++ b/Sources/EntityFramework/LoLDbContext.cs @@ -13,8 +13,9 @@ namespace EntityFramework public DbSet Skins { get; set; } - public DbSet Image { get; set; } + public DbSet Skills { get; set; } + public DbSet Image { get; set; } public DbSet Rune { get; set; } @@ -46,7 +47,8 @@ namespace EntityFramework modelBuilder.Entity().Property(entity => entity.Name) .IsRequired() - .HasMaxLength(50); + .HasMaxLength(50) + .ValueGeneratedOnAdd(); modelBuilder.Entity().Property(entity => entity.Bio) .HasMaxLength(500) @@ -76,11 +78,32 @@ namespace EntityFramework .HasForeignKey("ChampionEntityForeignKey"); + /// One to many + /// ChampionEntity ---> * SkillEntity + //création de la table ChampionEntity + //modelBuilder.Entity().HasKey(c => c.Name); //définition de la clé primaire + //modelBuilder.Entity().Property(c => c.Name) + // .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion + + //création de la table SkillEntity + modelBuilder.Entity().HasKey(s => s.Name); //définition de la clé primaire + modelBuilder.Entity().Property(s => s.Name) + .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion + // Add the shadow property to the model + modelBuilder.Entity() + .Property("ChampionEntityToSkillForeignKey"); + + // Use the shadow property as a foreign key + modelBuilder.Entity() + .HasOne(s => s.Champion) + .WithMany(c => c.Skills) + .HasForeignKey("ChampionEntityToSkillForeignKey"); - // Many to Many ChampionEntity - RunePageEntity - modelBuilder.Entity().HasKey(entity => entity.Name); + + /// Many to Many ChampionEntity - RunePageEntity + modelBuilder.Entity().HasKey(entity => entity.Name); modelBuilder.Entity().HasKey(entity => entity.Name); modelBuilder.Entity().ToTable("RunePage"); @@ -95,6 +118,23 @@ namespace EntityFramework .HasMany(c => c.RunePageEntities) .WithMany(r => r.Champion); //.HasForeignKey("AlbumForeignKey"); + + + + //création de la table RuneEntity + modelBuilder.Entity().HasKey(r => r.Name); //définition de la clé primaire + modelBuilder.Entity().Property(r => r.Name) + .ValueGeneratedOnAdd(); //définition du mode de génération de la clé : génération à l'insertion + + modelBuilder.Entity() + .Property("RuneForeignKey"); + + modelBuilder.Entity() + .HasOne(r => r.RunePage) + .WithMany(rp => rp.Runes) + .HasForeignKey("RuneForeignKey"); + + } } } diff --git a/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.Designer.cs b/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.Designer.cs new file mode 100644 index 0000000..79aa753 --- /dev/null +++ b/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.Designer.cs @@ -0,0 +1,225 @@ +// +using EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EntityFramework.Migrations +{ + [DbContext(typeof(LoLDbContext))] + [Migration("20230325150121_MigrSkill")] + partial class MigrSkill + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.Property("ChampionName") + .HasColumnType("TEXT"); + + b.Property("RunePageEntitiesName") + .HasColumnType("TEXT"); + + b.HasKey("ChampionName", "RunePageEntitiesName"); + + b.HasIndex("RunePageEntitiesName"); + + b.ToTable("ChampionEntityRunePageEntity"); + }); + + modelBuilder.Entity("EntityFramework.ChampionEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Bio") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("string") + .HasColumnName("Bio"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Image") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.ToTable("Champions", (string)null); + }); + + modelBuilder.Entity("EntityFramework.LargeImageEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Base64") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Image"); + }); + + modelBuilder.Entity("EntityFramework.RuneEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("RuneForeignKey") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex("RuneForeignKey"); + + b.ToTable("Rune"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("RuneName") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex("RuneName"); + + b.ToTable("RunePage", (string)null); + }); + + modelBuilder.Entity("EntityFramework.SkillEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ChampionEntityToSkillForeignKey") + .HasColumnType("TEXT"); + + b.Property("Description") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Name"); + + b.HasIndex("ChampionEntityToSkillForeignKey"); + + b.ToTable("Skills"); + }); + + modelBuilder.Entity("EntityFramework.SkinEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ChampionEntityForeignKey") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Image") + .HasColumnType("TEXT"); + + b.Property("Price") + .HasColumnType("REAL"); + + b.HasKey("Name"); + + b.HasIndex("ChampionEntityForeignKey"); + + b.ToTable("Skins"); + }); + + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", null) + .WithMany() + .HasForeignKey("ChampionName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EntityFramework.RunePageEntity", null) + .WithMany() + .HasForeignKey("RunePageEntitiesName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("EntityFramework.RuneEntity", b => + { + b.HasOne("EntityFramework.RunePageEntity", "RunePage") + .WithMany("Runes") + .HasForeignKey("RuneForeignKey"); + + b.Navigation("RunePage"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.HasOne("EntityFramework.RuneEntity", "Rune") + .WithMany() + .HasForeignKey("RuneName"); + + b.Navigation("Rune"); + }); + + modelBuilder.Entity("EntityFramework.SkillEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", "Champion") + .WithMany("Skills") + .HasForeignKey("ChampionEntityToSkillForeignKey"); + + b.Navigation("Champion"); + }); + + modelBuilder.Entity("EntityFramework.SkinEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", "Champion") + .WithMany("skins") + .HasForeignKey("ChampionEntityForeignKey"); + + b.Navigation("Champion"); + }); + + modelBuilder.Entity("EntityFramework.ChampionEntity", b => + { + b.Navigation("Skills"); + + b.Navigation("skins"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.Navigation("Runes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.cs b/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.cs new file mode 100644 index 0000000..4631e3a --- /dev/null +++ b/Sources/EntityFramework/Migrations/20230325150121_MigrSkill.cs @@ -0,0 +1,197 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace EntityFramework.Migrations +{ + /// + public partial class MigrSkill : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Champions", + columns: table => new + { + Name = table.Column(type: "TEXT", maxLength: 50, nullable: false), + Bio = table.Column(type: "string", maxLength: 500, nullable: false), + Icon = table.Column(type: "TEXT", nullable: false), + Image = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Champions", x => x.Name); + }); + + migrationBuilder.CreateTable( + name: "Image", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Base64 = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Image", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Skills", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + Type = table.Column(type: "INTEGER", nullable: false), + Description = table.Column(type: "TEXT", nullable: false), + ChampionEntityToSkillForeignKey = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Skills", x => x.Name); + table.ForeignKey( + name: "FK_Skills_Champions_ChampionEntityToSkillForeignKey", + column: x => x.ChampionEntityToSkillForeignKey, + principalTable: "Champions", + principalColumn: "Name"); + }); + + migrationBuilder.CreateTable( + name: "Skins", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + Description = table.Column(type: "TEXT", nullable: true), + Icon = table.Column(type: "TEXT", nullable: false), + Image = table.Column(type: "TEXT", nullable: true), + Price = table.Column(type: "REAL", nullable: false), + ChampionEntityForeignKey = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Skins", x => x.Name); + table.ForeignKey( + name: "FK_Skins_Champions_ChampionEntityForeignKey", + column: x => x.ChampionEntityForeignKey, + principalTable: "Champions", + principalColumn: "Name"); + }); + + migrationBuilder.CreateTable( + name: "ChampionEntityRunePageEntity", + columns: table => new + { + ChampionName = table.Column(type: "TEXT", nullable: false), + RunePageEntitiesName = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChampionEntityRunePageEntity", x => new { x.ChampionName, x.RunePageEntitiesName }); + table.ForeignKey( + name: "FK_ChampionEntityRunePageEntity_Champions_ChampionName", + column: x => x.ChampionName, + principalTable: "Champions", + principalColumn: "Name", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Rune", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + RuneForeignKey = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Rune", x => x.Name); + }); + + migrationBuilder.CreateTable( + name: "RunePage", + columns: table => new + { + Name = table.Column(type: "TEXT", nullable: false), + RuneName = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_RunePage", x => x.Name); + table.ForeignKey( + name: "FK_RunePage_Rune_RuneName", + column: x => x.RuneName, + principalTable: "Rune", + principalColumn: "Name"); + }); + + migrationBuilder.CreateIndex( + name: "IX_ChampionEntityRunePageEntity_RunePageEntitiesName", + table: "ChampionEntityRunePageEntity", + column: "RunePageEntitiesName"); + + migrationBuilder.CreateIndex( + name: "IX_Rune_RuneForeignKey", + table: "Rune", + column: "RuneForeignKey"); + + migrationBuilder.CreateIndex( + name: "IX_RunePage_RuneName", + table: "RunePage", + column: "RuneName"); + + migrationBuilder.CreateIndex( + name: "IX_Skills_ChampionEntityToSkillForeignKey", + table: "Skills", + column: "ChampionEntityToSkillForeignKey"); + + migrationBuilder.CreateIndex( + name: "IX_Skins_ChampionEntityForeignKey", + table: "Skins", + column: "ChampionEntityForeignKey"); + + migrationBuilder.AddForeignKey( + name: "FK_ChampionEntityRunePageEntity_RunePage_RunePageEntitiesName", + table: "ChampionEntityRunePageEntity", + column: "RunePageEntitiesName", + principalTable: "RunePage", + principalColumn: "Name", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_Rune_RunePage_RuneForeignKey", + table: "Rune", + column: "RuneForeignKey", + principalTable: "RunePage", + principalColumn: "Name"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Rune_RunePage_RuneForeignKey", + table: "Rune"); + + migrationBuilder.DropTable( + name: "ChampionEntityRunePageEntity"); + + migrationBuilder.DropTable( + name: "Image"); + + migrationBuilder.DropTable( + name: "Skills"); + + migrationBuilder.DropTable( + name: "Skins"); + + migrationBuilder.DropTable( + name: "Champions"); + + migrationBuilder.DropTable( + name: "RunePage"); + + migrationBuilder.DropTable( + name: "Rune"); + } + } +} diff --git a/Sources/EntityFramework/Migrations/LoLDbContextModelSnapshot.cs b/Sources/EntityFramework/Migrations/LoLDbContextModelSnapshot.cs new file mode 100644 index 0000000..c1b9974 --- /dev/null +++ b/Sources/EntityFramework/Migrations/LoLDbContextModelSnapshot.cs @@ -0,0 +1,222 @@ +// +using EntityFramework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace EntityFramework.Migrations +{ + [DbContext(typeof(LoLDbContext))] + partial class LoLDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.Property("ChampionName") + .HasColumnType("TEXT"); + + b.Property("RunePageEntitiesName") + .HasColumnType("TEXT"); + + b.HasKey("ChampionName", "RunePageEntitiesName"); + + b.HasIndex("RunePageEntitiesName"); + + b.ToTable("ChampionEntityRunePageEntity"); + }); + + modelBuilder.Entity("EntityFramework.ChampionEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Bio") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("string") + .HasColumnName("Bio"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Image") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.ToTable("Champions", (string)null); + }); + + modelBuilder.Entity("EntityFramework.LargeImageEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Base64") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Image"); + }); + + modelBuilder.Entity("EntityFramework.RuneEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("RuneForeignKey") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex("RuneForeignKey"); + + b.ToTable("Rune"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("RuneName") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex("RuneName"); + + b.ToTable("RunePage", (string)null); + }); + + modelBuilder.Entity("EntityFramework.SkillEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ChampionEntityToSkillForeignKey") + .HasColumnType("TEXT"); + + b.Property("Description") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Name"); + + b.HasIndex("ChampionEntityToSkillForeignKey"); + + b.ToTable("Skills"); + }); + + modelBuilder.Entity("EntityFramework.SkinEntity", b => + { + b.Property("Name") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ChampionEntityForeignKey") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Image") + .HasColumnType("TEXT"); + + b.Property("Price") + .HasColumnType("REAL"); + + b.HasKey("Name"); + + b.HasIndex("ChampionEntityForeignKey"); + + b.ToTable("Skins"); + }); + + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", null) + .WithMany() + .HasForeignKey("ChampionName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("EntityFramework.RunePageEntity", null) + .WithMany() + .HasForeignKey("RunePageEntitiesName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("EntityFramework.RuneEntity", b => + { + b.HasOne("EntityFramework.RunePageEntity", "RunePage") + .WithMany("Runes") + .HasForeignKey("RuneForeignKey"); + + b.Navigation("RunePage"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.HasOne("EntityFramework.RuneEntity", "Rune") + .WithMany() + .HasForeignKey("RuneName"); + + b.Navigation("Rune"); + }); + + modelBuilder.Entity("EntityFramework.SkillEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", "Champion") + .WithMany("Skills") + .HasForeignKey("ChampionEntityToSkillForeignKey"); + + b.Navigation("Champion"); + }); + + modelBuilder.Entity("EntityFramework.SkinEntity", b => + { + b.HasOne("EntityFramework.ChampionEntity", "Champion") + .WithMany("skins") + .HasForeignKey("ChampionEntityForeignKey"); + + b.Navigation("Champion"); + }); + + modelBuilder.Entity("EntityFramework.ChampionEntity", b => + { + b.Navigation("Skills"); + + b.Navigation("skins"); + }); + + modelBuilder.Entity("EntityFramework.RunePageEntity", b => + { + b.Navigation("Runes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Sources/EntityFramework/Program.cs b/Sources/EntityFramework/Program.cs index 56915f8..378e412 100644 --- a/Sources/EntityFramework/Program.cs +++ b/Sources/EntityFramework/Program.cs @@ -38,64 +38,101 @@ using ( var context = new LoLDbContext()) context.SaveChanges(); -IDataManager dataManager = new EFDataManager(); -IChampionsManager championsManager = dataManager.ChampionsMgr; -IEnumerable champions = await championsManager.GetItemsByName("A", 0, 1); -Console.WriteLine(champions.First().Name); - - -//using ( var context = new LoLDbContext()) -//{ -// //context.Add(new ChampionEntity{ Name = "test", Bio = "test", Icon = "test" } ); -// context.SaveChanges(); - -// ChampionEntity champ = context.Find("Akali"); - -// if( champ != null) -// { -// Console -// .WriteLine(champ.ToString()); - -// } -// else -// { -// Console.WriteLine("Not Found"); -// } - -// //Test BDD Skills -// ChampionEntity champSkill = new ChampionEntity { Name="nomSkill", Bio="bioSkill", Icon="iconSkill" }; - -// //SkillEntity s1 = new SkillEntity { Name = "Skill1", Description = "desc", Type = SkillType.Unknown }; -// SkillEntity s2 = new SkillEntity { Name="Skill2", Description="desc2", Type=SkillType.Ultimate }; -// SkillEntity s3 = new SkillEntity { Name = "Skill3", Description = "desc3", Type = SkillType.Passive }; - -// champSkill.AddSkill(new SkillEntity { Name = "Skill1", Description = "desc", Type = SkillType.Unknown }); -// champSkill.AddSkill(s2); -// champSkill.AddSkill(s3); - -// context.Add(champSkill); - -// context.SaveChanges(); + IDataManager dataManager = new EFDataManager(); + IChampionsManager championsManager = dataManager.ChampionsMgr; + IEnumerable champions = await championsManager.GetItemsByName("A", 0, 1); + //Console.WriteLine(champions.First().Name); + + + //using ( var context = new LoLDbContext()) + //{ + // //context.Add(new ChampionEntity{ Name = "test", Bio = "test", Icon = "test" } ); + // context.SaveChanges(); + + // ChampionEntity champ = context.Find("Akali"); + + // if( champ != null) + // { + // Console + // .WriteLine(champ.ToString()); + + // } + // else + // { + // Console.WriteLine("Not Found"); + // } + + // //Test BDD Skills + // ChampionEntity champSkill = new ChampionEntity { Name="nomSkill", Bio="bioSkill", Icon="iconSkill" }; + + // //SkillEntity s1 = new SkillEntity { Name = "Skill1", Description = "desc", Type = SkillType.Unknown }; + // SkillEntity s2 = new SkillEntity { Name="Skill2", Description="desc2", Type=SkillType.Ultimate }; + // SkillEntity s3 = new SkillEntity { Name = "Skill3", Description = "desc3", Type = SkillType.Passive }; + + // champSkill.AddSkill(new SkillEntity { Name = "Skill1", Description = "desc", Type = SkillType.Unknown }); + // champSkill.AddSkill(s2); + // champSkill.AddSkill(s3); + + // context.Add(champSkill); + + // context.SaveChanges(); + + + // //OneToMany + // Console.WriteLine("Champions : "); + // foreach (var champi in context.Champions.Include(a => a.skins)) + // { + // Console.WriteLine($"\t{champi.Name} : {champi.Bio}"); + // foreach (var s in champi.skins) + // { + // Console.WriteLine($"\t\t{s.Name}"); + // } + // } + + // Console.WriteLine(); + + // Console.WriteLine("Skin :"); + // foreach (var s in context.Skins) + // { + // Console.WriteLine($"\t{s.Name}: {s.Description} (Champion : {s.Champion.Name})"); + // } + + Console.WriteLine("\nAjout d'un Champion et 6 Skins...\n"); + + ChampionEntity captainMarvel = new ChampionEntity { Name = "Captain Marvel", Bio = "Mais que fait un avenger ici ??", Icon = "Icon.png" }; + SkinEntity[] skins = { new SkinEntity {Name = "La Fiesta", Champion = captainMarvel}, + new SkinEntity { Name = "Five Hundred Miles High", Champion = captainMarvel }, + new SkinEntity { Name = "Captain Marvel", Champion = captainMarvel }, + new SkinEntity { Name = "Time's Lie", Champion = captainMarvel }, + new SkinEntity { Name = "Lush Life", Champion = captainMarvel }, + new SkinEntity { Name = "Day Waves", Champion = captainMarvel } + }; + foreach (var s in skins) + { + captainMarvel.skins.Add(s); + } + context.Add(captainMarvel); + context.SaveChanges(); -// //OneToMany -// Console.WriteLine("Champions : "); -// foreach (var champi in context.Champions.Include(a => a.skins)) -// { -// Console.WriteLine($"\t{champi.Name} : {champi.Bio}"); -// foreach (var s in champi.skins) -// { -// Console.WriteLine($"\t\t{s.Name}"); -// } -// } -// Console.WriteLine(); + //OnetoMany Skill + ChampionEntity Levram = new ChampionEntity { Name = "Captain Levram", Bio="bio", Icon="/img" }; + SkillEntity[] morceaux = { new SkillEntity { Name = "La Fiesta", Description="SkillDesc", Type=EntityFramework.SkillType.Unknown, Champion= Levram }, + new SkillEntity { Name = "berserk", Description="SkillDesc1", Type=EntityFramework.SkillType.Unknown, Champion= Levram }, + new SkillEntity { Name = "taunt", Description = "SkillDesc2", Type = EntityFramework.SkillType.Unknown, Champion = Levram }, + new SkillEntity { Name = "fear", Description = "SkillDesc3", Type = EntityFramework.SkillType.Unknown, Champion = Levram }, + new SkillEntity { Name = "flashHeal", Description = "SkillDesc4", Type = EntityFramework.SkillType.Unknown, Champion = Levram }, + new SkillEntity { Name = "bubbuletp", Description = "SkillDesc5", Type = EntityFramework.SkillType.Unknown, Champion = Levram } + }; + foreach (var m in morceaux) + { + Levram.Skills.Add(m); + } + + context.Add(Levram); + context.SaveChanges(); -// Console.WriteLine("Skin :"); -// foreach (var s in context.Skins) -// { -// Console.WriteLine($"\t{s.Name}: {s.Description} (Champion : {s.Champion.Name})"); -// } var r1 = new RuneEntity { Name = "Rune1", Description = "aaa", Family = EnumRuneFamily.Domination, Image = new LargeImage("base") }; @@ -109,24 +146,4 @@ Console.WriteLine(champions.First().Name); context.Champions.AddRange(new[] { corichard, pintrand }); context.RunePage.AddRange(new[] { rp1, rp2 }); context.SaveChanges(); -} -// Console.WriteLine("\nAjout d'un Champion et 6 Skins...\n"); - -// ChampionEntity captainMarvel = new ChampionEntity { Name = "Captain Marvel", Bio="Mais que fait un avenger ici ??", Icon="Icon.png"}; -// SkinEntity[] skins = { new SkinEntity {Name = "La Fiesta", Champion = captainMarvel}, -// new SkinEntity { Name = "Five Hundred Miles High", Champion = captainMarvel }, -// new SkinEntity { Name = "Captain Marvel", Champion = captainMarvel }, -// new SkinEntity { Name = "Time's Lie", Champion = captainMarvel }, -// new SkinEntity { Name = "Lush Life", Champion = captainMarvel }, -// new SkinEntity { Name = "Day Waves", Champion = captainMarvel } -// }; -// foreach (var s in skins) -// { -// captainMarvel.skins.Add(s); -// } - -// context.Add(captainMarvel); -// context.SaveChanges(); - - -//} +} \ No newline at end of file diff --git a/Sources/EntityFramework/RuneEntity.cs b/Sources/EntityFramework/RuneEntity.cs index c9de7da..5047c19 100644 --- a/Sources/EntityFramework/RuneEntity.cs +++ b/Sources/EntityFramework/RuneEntity.cs @@ -20,5 +20,9 @@ namespace EntityFramework public EnumRuneFamily Family; public LargeImage Image; + + + //OtM + public RunePageEntity RunePage { get; set; } } } diff --git a/Sources/EntityFramework/RunePageEntity.cs b/Sources/EntityFramework/RunePageEntity.cs index 842806b..61270de 100644 --- a/Sources/EntityFramework/RunePageEntity.cs +++ b/Sources/EntityFramework/RunePageEntity.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -16,7 +17,11 @@ namespace EntityFramework public RuneEntity? Rune { get; set; } //? voir si cela pause probleme - public Dictionary Dico = new Dictionary(); + //public Dictionary Dico = new Dictionary(); + + // One to many pour l'instant, voir si on retransforme en dico : + public ICollection Runes { get; set; } + // Pour le many to many Champion *<---->* RunePage public ICollection Champion{ get; set; } diff --git a/Sources/EntityFramework/SkillEntity.cs b/Sources/EntityFramework/SkillEntity.cs index 505a427..22ed683 100644 --- a/Sources/EntityFramework/SkillEntity.cs +++ b/Sources/EntityFramework/SkillEntity.cs @@ -49,5 +49,9 @@ namespace EntityFramework // this.Description = Description; // this.Type = Type; //} + + + // One to many with champion : + public ChampionEntity Champion { get; set; } } } diff --git a/Sources/EntityFramework/SkinEntity.cs b/Sources/EntityFramework/SkinEntity.cs index e9650b3..f92a44d 100644 --- a/Sources/EntityFramework/SkinEntity.cs +++ b/Sources/EntityFramework/SkinEntity.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,7 +9,8 @@ namespace EntityFramework { public class SkinEntity //ONE TO MANY { - + + [Key] public string? Name { get; set; } public string? Description { get; set; } diff --git a/Sources/EntityFramework/StubbedContext.cs b/Sources/EntityFramework/StubbedContext.cs index 3731035..4bf0d84 100644 --- a/Sources/EntityFramework/StubbedContext.cs +++ b/Sources/EntityFramework/StubbedContext.cs @@ -42,10 +42,43 @@ namespace EntityFramework new { Name = "ruby", ChampionEntityForeignKey = "Pintrand", Description = "So What", Icon = "/Icon.png", Price = 10.0f } ); + //Skills + modelBuilder.Entity().HasData(new { Name="Skill", Description="Desc", Type= SkillType.Basic, ChampionEntityToSkillForeignKey= "Corichard" }, + new { Name = "Skill2", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Corichard" }, + new { Name = "Skill3", Description = "Desc", Type = SkillType.Passive, ChampionEntityToSkillForeignKey = "Corichard" }, + new { Name = "Skill4", Description = "Desc", Type = SkillType.Unknown, ChampionEntityToSkillForeignKey = "Corichard" }, + new { Name = "Skill5", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Corichard" }, + new { Name = "Skill6", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Corichard" }, + new { Name = "Skill10", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Pintrand" }, + new { Name = "Skill11", Description = "Desc", Type = SkillType.Unknown, ChampionEntityToSkillForeignKey = "Pintrand" }, + new { Name = "Skill12", Description = "Desc", Type = SkillType.Passive, ChampionEntityToSkillForeignKey = "Pintrand" }, + new { Name = "Skill13", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Pintrand" }, + new { Name = "Skill14", Description = "Desc", Type = SkillType.Basic, ChampionEntityToSkillForeignKey = "Pintrand" } + ); + + + + modelBuilder.Entity().HasData(new { Name = "RP1", Rune = r1, Champion = corichard}, new { Name = "RP2", Rune = r2, Champion = pintrand} ); + + + + RunePageEntity rp11 = new RunePageEntity { Name = "rp11"}; + RunePageEntity rp21 = new RunePageEntity { Name = "rp21"}; + + modelBuilder.Entity().HasData(rp11, rp21); + + modelBuilder.Entity().HasData(new { Name = "Rune", Description = "Desc", Famille = EnumRuneFamily.Domination, RuneForeignKey = "rp11" }, + new{Name = "Rune2", Description = "Desc",Famille = EnumRuneFamily.Domination,RuneForeignKey = "rp11"}, + new { Name = "Rune3", Description = "Desc", Famille = EnumRuneFamily.Domination, RuneForeignKey = "rp21" }, + new { Name = "Rune4", Description = "Desc", Famille = EnumRuneFamily.Domination, RuneForeignKey = "rp21" } + ); } + + + } } diff --git a/Sources/EntityFramework/champion.db b/Sources/EntityFramework/champion.db new file mode 100644 index 0000000000000000000000000000000000000000..c71528bf67720357cd407d1a5b1ca93117b28420 GIT binary patch literal 90112 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 en3cfUzOyQDw(qQpgcFkRDrt)36n7NDN%&u*r Date: Sat, 25 Mar 2023 23:05:59 +0100 Subject: [PATCH 2/2] ajout d'un RuneController (et donc de RuneMapper et RuneDTO) :package: --- .../API_LoL/Controllers/RunesController.cs | 186 ++++++++++++++++++ Sources/API_LoL/Mapper/RuneMapper.cs | 19 ++ Sources/DTO/DTO.csproj | 1 + Sources/DTO/RuneDTO.cs | 43 ++++ 4 files changed, 249 insertions(+) create mode 100644 Sources/API_LoL/Controllers/RunesController.cs create mode 100644 Sources/API_LoL/Mapper/RuneMapper.cs create mode 100644 Sources/DTO/RuneDTO.cs diff --git a/Sources/API_LoL/Controllers/RunesController.cs b/Sources/API_LoL/Controllers/RunesController.cs new file mode 100644 index 0000000..899c445 --- /dev/null +++ b/Sources/API_LoL/Controllers/RunesController.cs @@ -0,0 +1,186 @@ +using API_LoL.Mapper; +using DTO; +using EntityFramework; +using Microsoft.AspNetCore.Mvc; +using Model; + +namespace API_LoL.Controllers +{ + [Route("api/v{version:apiVersion}/[controller]")] + [ApiController] + public class RunesController : ControllerBase + { + + + public RunesController(IDataManager Manager) + { + this.RunesManager = Manager.RunesMgr; + } + + private IRunesManager RunesManager; + + // GET api//5 + + [HttpGet("count")] + public async Task GetCount() + { + return Ok(RunesManager.GetNbItems()); + } + + [HttpGet] + public async Task Get(string? name = null, string desc = null, EnumRuneFamily Family = EnumRuneFamily.Unknown, LargeImage Image = null, int index = 0, int size = 10) + { + if (size - index > 10) + { + return BadRequest(); + } + if (!string.IsNullOrEmpty(name)) + { + var list = await RunesManager.GetItemsByName(name, index, size); + if (list.Count() != 0) + { + return Ok(list.Select(rune => rune?.ToDTO())); + } + else { return NoContent(); } + } + ///else if peu important : on ne cherche pas des runes par famille ou description + //else if (!string.IsNullOrEmpty(desc)) + //{ + // var list = await RunesManager.GetItemsBySkill(desc, index, size); + // if (list.Count() != 0) + // { + // return Ok(list.Select(champion => champion?.ToDTO())); + // } + // else { return NoContent(); } + //} + //else if (!string.IsNullOrEmpty(Family)) + //{ + // var list = await RunesManager.GetItems(index, size); + // if (list.Count() != 0) + // { + // return Ok(list.Select(champion => champion?.ToDTO())); + // } + // else { return NoContent(); } + //} + //else if (!string.IsNullOrEmpty(Image)) + //{ + // var list = await RunesManager.GetItems(index, size); + // if (list.Count() != 0) + // { + // return Ok(list.Select(champion => champion?.ToDTO())); + // } + // else { return NoContent(); } + //} + else + { + var list = await RunesManager.GetItems(index, size); + if (list.Count() != 0) + { + return Ok(list.Select(champion => champion?.ToDTO())); + } + else { return NoContent(); } + } + } + + [HttpGet("name")] + public async Task GetByName(String name) + { + if (string.IsNullOrEmpty(name)) return BadRequest(); + var list = await RunesManager.GetItemsByName(name, 0, 1); + if (list.Count() == 1) + { + return Ok(list.Select(rune => rune?.ToDTO()).First()); + } + else { return NoContent(); } + + } + + //[HttpGet("name/skins")] + //public async Task GetSkinsByName(String name) + //{ + // if (string.IsNullOrEmpty(name)) return BadRequest(); + // var list = await RunesManager.GetItemsByName(name, 0, 1); + // if (list.Count() == 1) + // { + // var nb = await SkinsManager.GetNbItemsByChampion(list.First()); + // if (nb != 0) + // { + // var skins = await SkinsManager.GetItemsByChampion(list.First(), 0, nb); + // return Ok(skins.Select(skin => skin?.ToDTO())); + // } + // else { return NoContent(); } + // } + // else { return NoContent(); } + //} + + //[HttpGet("name/skills")] + //public async Task GetSkillsByName(String name) + //{ + // if (string.IsNullOrEmpty(name)) return BadRequest(); + // var list = await RunesManager.GetItemsByName(name, 0, 1); + // if (list.Count() == 1) + // { + // var skins = await SkinsManager.GetItemsByChampion(list.First(), 0, await SkinsManager.GetNbItemsByChampion(list.First())); + // if (skins.Count() != 0) + // { + // return Ok(skins.Select(skin => skin?.ToDTO())); + // } + // else { return NoContent(); } + // } + // else { return NoContent(); } + //} + + + + // POST api/ + [HttpPost] + public async Task Post(RuneDTO rune) + { + if (rune == null) + { + return UnprocessableEntity(); + } + else + { + var champ = await RunesManager.GetItemsByName(rune.Name, 0, 1); + if (champ.Count() != 0 && champ.FirstOrDefault().Name == rune.Name) + { + return Conflict(rune); + } + await RunesManager.AddItem(rune.ToRune()); + return CreatedAtAction("Post", rune); + + } + } + + // PUT api//5 + [HttpPut("name")] + public async Task Put(string name, RuneDTO rune) + { + if (string.IsNullOrEmpty(name)) + return BadRequest(); + if (rune == null) + return UnprocessableEntity(); + var list = await RunesManager.GetItemsByName(name, 0, 1); + if (list.Count() == 1) + { + return Ok(RunesManager.UpdateItem(list.First(), rune.ToRune())); + } + else { return NoContent(); } + } + + // DELETE api//5 + [HttpDelete("name")] + public async Task Delete(string name) + { + if (string.IsNullOrEmpty(name)) + return BadRequest(); + var list = await RunesManager.GetItemsByName(name, 0, 1); + if (list.Count() == 1) + { + return Ok(await RunesManager.DeleteItem(list.First())); + } + else { return NoContent(); } + } + } +} diff --git a/Sources/API_LoL/Mapper/RuneMapper.cs b/Sources/API_LoL/Mapper/RuneMapper.cs new file mode 100644 index 0000000..92aa560 --- /dev/null +++ b/Sources/API_LoL/Mapper/RuneMapper.cs @@ -0,0 +1,19 @@ +using DTO; +using Model; + +namespace API_LoL.Mapper +{ + public static class RuneMapper + { + public static RuneDTO ToDTO(this Rune rune) + { + return new RuneDTO(rune.Name, rune.Description, rune.Family, rune.Image, rune.Icon); + } + + public static Rune ToRune(this RuneDTO rune) + { + return new Rune(rune.Name, rune.Family, rune.Icon, rune.Image.Base64, rune.Description); + + } + } +} diff --git a/Sources/DTO/DTO.csproj b/Sources/DTO/DTO.csproj index dd77eab..4e05eb4 100644 --- a/Sources/DTO/DTO.csproj +++ b/Sources/DTO/DTO.csproj @@ -7,6 +7,7 @@ + diff --git a/Sources/DTO/RuneDTO.cs b/Sources/DTO/RuneDTO.cs new file mode 100644 index 0000000..4cdb42c --- /dev/null +++ b/Sources/DTO/RuneDTO.cs @@ -0,0 +1,43 @@ +using EntityFramework; +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DTO +{ + public class RuneDTO + { + public RuneDTO(string name, string desc, RuneFamily family, LargeImage image, string icon) + { + Name = name; + Description = desc; + Family = family; + Image = image; + Icon = icon; + } + + public string Name { get; set; } + public string Description { get; set; } + public RuneFamily Family { get; set; } + public string Icon { get; set; } + + public LargeImage Image { get; set; } + + public bool equals(RuneDTO other) + { + return other.Name == Name + && other.Description == Description + && other.Family == Family + && other.Image == Image + && other.Icon == Icon; + } + + public string toString() + { + return Name + Description + Family.ToString(); + } + } +}