diff --git a/Sources/ConsoleDbSQLite/Program.cs b/Sources/ConsoleDbSQLite/Program.cs index c27c11b..4469601 100644 --- a/Sources/ConsoleDbSQLite/Program.cs +++ b/Sources/ConsoleDbSQLite/Program.cs @@ -3,7 +3,9 @@ using DBEntitiesWithStub; using EntityFrameworkLib; using Microsoft.EntityFrameworkCore; +using Model; using System.Net; +using static Model.RunePage; // Test d'ajout d'image dans la BDD d'un Champion avec son image string imageUrl = "https://ddragon.leagueoflegends.com/cdn/img/champion/splash/Jax_0.jpg"; @@ -63,7 +65,7 @@ List skins = new List } }; -List characteristic = new List +List characteristics = new List { new CharacteristicEntity { @@ -77,6 +79,25 @@ List characteristic = new List } }; + +List runePages = new List +{ + new RunePageEntity + { + Name = "Jax Top", + Runes = new Dictionary + { + { Category.Major, new RuneEntity { Name = "Tempo Mortel", Description = "Les attaques de base contre les champions ennemisoctroient un cumul pendant 6 secondes, se régénérant lors des attaques suivantes et se cumulant jusqu'à 6 fois. Gagnez ( 10 % − 15 % / 4 % − 9 % ) (basé sur le niveau) vitesse d'attaque bonus pour chaque cumul, jusqu'à ( 60 % − 90 % / 24 % − 54 % ) (basé sur le niveau) au maximum de cumuls, auquel vous gagnez également 50 bonus de portée d'attaque et augmentez le plafond de vitesse d'attaque à 10.", RuneFamily = RuneFamily.Precision } }, + { Category.Minor1, new RuneEntity { Name = "Triomphe", Description = "marquer un takedown contre un champion ennemivous soigne de 2,5 % de votre santé maximale (+ 5 % de votre santé manquante ) et vous accorde un bonus supplémentaire de 20 pièces d'or après un délai de 1 seconde.", RuneFamily = RuneFamily.Precision} }, + { Category.Minor2, new RuneEntity { Name = "Légende : alatricité", Description = "Gagnez 3 % (+ 1,5 % par pile de légende ) en vitesse d'attaque bonus , jusqu'à 18 % aux piles maximales.", RuneFamily = RuneFamily.Precision} }, + { Category.Minor3, new RuneEntity { Name = "Baroud d'honneur", Description = "Vous infligez 5% - 11% de dégâts supplémentaires aux champions quand vous avez moins de 60% de vos PV. Les dégâts max sont atteints à 30% de vos PV.", RuneFamily = RuneFamily.Precision}}, + { Category.OtherMinor1, new RuneEntity { Name = "Plaque d'os", Description = "Après avoir subi des dégâts d'un champion ennemi, les 3 prochains sorts ou attaques de ce champion vous infligent 30 - 60 pts de dégâts en moins. Durée : 1.5 sec. Délai de récupération : 55 sec.", RuneFamily = RuneFamily.Unknown} }, + { Category.OtherMinor2, new RuneEntity { Name = "Inébranlable", Description = "Vous gagnez +5% de Ténacité et +5% de résistance aux ralentissements. Ces valeurs augmentent avec vos PV manquants, jusqu'à +20% de Ténacité et +20% de résistance aux ralentissements supplémentaires. Les valeurs max sont atteintes à 30% de vos PV. ", RuneFamily = RuneFamily.Unknown} } + } + } +}; + + using (var context = new SQLiteLolContext()) { ChampionEntity jax = new ChampionEntity @@ -87,7 +108,8 @@ using (var context = new SQLiteLolContext()) Class = Model.ChampionClass.Fighter, Image = image, Skins = skins, - Characteristics = characteristic + Characteristics = characteristics, + RunePages = runePages }; context.Champions.Add(jax); context.SaveChanges(); diff --git a/Sources/ConsoleDbSQLite/projet.Champions.db b/Sources/ConsoleDbSQLite/projet.Champions.db deleted file mode 100644 index c66db47..0000000 Binary files a/Sources/ConsoleDbSQLite/projet.Champions.db and /dev/null differ diff --git a/Sources/EntityFrameworkLib/LolContext.cs b/Sources/EntityFrameworkLib/LolContext.cs index a0e47df..6296cc4 100644 --- a/Sources/EntityFrameworkLib/LolContext.cs +++ b/Sources/EntityFrameworkLib/LolContext.cs @@ -14,7 +14,6 @@ namespace EntityFrameworkLib public DbSet Images { get; set; } public DbSet Runes { get; set; } public DbSet RunesPage { get; set; } - public DbSet RunePageRunes { get; set; } public LolContext() { } public LolContext(DbContextOptions options) : base(options) { } @@ -33,7 +32,6 @@ namespace EntityFrameworkLib modelBuilder.Entity().Property(l => l.Id).ValueGeneratedOnAdd(); modelBuilder.Entity().HasKey(c => new { c.Name, c.ChampionForeignKey }); - modelBuilder.Entity().HasKey(c => new { c.RunePageName, c.RuneName }); //Relation one-to-one entre un champion et une largeImage : un champion n'a qu'une seule largeImage et une largeImage ne peut être attribuée qu'à un seul champion modelBuilder.Entity() @@ -57,7 +55,8 @@ namespace EntityFrameworkLib //Relation many-to-many entre les champions et pages de runes : Un Champion peut avoir plusieurs pages de runes et plusieurs pages de runes peuvent être définies sur un champion modelBuilder.Entity() .HasMany(c => c.RunePages) - .WithMany(r => r.Champions); + .WithMany(r => r.Champions) + .UsingEntity(x => x.ToTable("ChampionRunePages")); } } } diff --git a/Sources/EntityFrameworkLib/RuneEntity.cs b/Sources/EntityFrameworkLib/RuneEntity.cs index 638e107..b177e67 100644 --- a/Sources/EntityFrameworkLib/RuneEntity.cs +++ b/Sources/EntityFrameworkLib/RuneEntity.cs @@ -20,7 +20,6 @@ namespace EntityFrameworkLib [Required] public RuneFamily RuneFamily { get; set; } - public ICollection? RunePages { get; set; } public int? ImageId { get; set; } [ForeignKey("ImageId")] diff --git a/Sources/EntityFrameworkLib/RunePageEntity.cs b/Sources/EntityFrameworkLib/RunePageEntity.cs index ea20621..3719dc2 100644 --- a/Sources/EntityFrameworkLib/RunePageEntity.cs +++ b/Sources/EntityFrameworkLib/RunePageEntity.cs @@ -1,9 +1,11 @@ -using System; +using Model; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using static Model.RunePage; namespace EntityFrameworkLib { @@ -12,8 +14,12 @@ namespace EntityFrameworkLib [Key] [MaxLength(256)] public string Name { get; set; } - - public ICollection Runes { get; set; } - public ICollection Champions { get; set; } + public RuneEntity? this[Category category] + { + get { return Runes.ContainsKey(category) ? Runes[category] : null; } + set { Runes[category] = value; } + } + public Dictionary Runes { get; set; } + public ICollection? Champions { get; set; } } } diff --git a/Sources/EntityFrameworkLib/RunePageRuneEntity.cs b/Sources/EntityFrameworkLib/RunePageRuneEntity.cs deleted file mode 100644 index d41657c..0000000 --- a/Sources/EntityFrameworkLib/RunePageRuneEntity.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static Model.RunePage; - -namespace EntityFrameworkLib -{ - public class RunePageRuneEntity - { - public Category Category { get; set; } - - [ForeignKey("RuneName")] - public RuneEntity Rune { get; set; } - public string RuneName { get; set; } - - [ForeignKey("RunePageName")] - public RunePageEntity RunePage { get; set; } - public string RunePageName { get; set; } - } -} diff --git a/Sources/UnitTestsSQLiteInMemory/ChampionsDbTests.cs b/Sources/UnitTestsSQLiteInMemory/ChampionsDbTests.cs index 4c580e2..2c07bac 100644 --- a/Sources/UnitTestsSQLiteInMemory/ChampionsDbTests.cs +++ b/Sources/UnitTestsSQLiteInMemory/ChampionsDbTests.cs @@ -138,7 +138,7 @@ namespace UnitTestsSQLiteInMemory { context.Database.EnsureCreated(); } - var manager = new StubData.ChampionsManager(data); + var manager = new ChampionsManager(data); var champion = new Champion("TestChampion", ChampionClass.Mage); var addedChampion = await manager.AddItem(champion); @@ -160,7 +160,7 @@ namespace UnitTestsSQLiteInMemory [Fact] public async Task TestGetChampionsByClass() { - var manager = new StubData.ChampionsManager(data); + var manager = new ChampionsManager(data); var nbAssassins = await manager.GetNbItemsByClass(ChampionClass.Assassin); Assert.Equal(1, nbAssassins); @@ -174,5 +174,32 @@ namespace UnitTestsSQLiteInMemory var mages = await manager.GetItemsByClass(ChampionClass.Mage, 0, nbMages, "Name", descending: true); Assert.Equal("Ahri", mages.First().Name); } + + [Fact] + public async Task TestAddAndGetSkinsByName() + { + var manager = new SkinsManager(data); + + var champion = new Champion("Jax", ChampionClass.Fighter); + var skin = new Skin("Jaximus", champion); + var addSkin = await manager.AddItem(skin); + Assert.Equal(skin, addSkin); + + var nbSkins = await manager.GetNbItemsByName("Jaximus"); + Assert.Equal(1, nbSkins); + } + + [Fact] + public async Task TestDeleteAndGetSkins() + { + var manager = new SkinsManager(data); + + var champion = new Champion("Jax", ChampionClass.Fighter); + var skin = new Skin("Jaximus", champion); + var addSkin = await manager.AddItem(skin); + Assert.Equal(skin, addSkin); + var isDelete = await manager.DeleteItem(skin); + Assert.True(isDelete); + } } } \ No newline at end of file