From 8dbccb92e77d38eee677044a96b165f9548f2512 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 24 Feb 2023 16:10:08 +0100 Subject: [PATCH 1/4] Adding business DbData manager structure --- .../Sources/Business/Business.csproj | 13 +++ .../Sources/Business/DbData.Champions.cs | 105 ++++++++++++++++++ .../Sources/Business/DbData.RunePages.cs | 75 +++++++++++++ .../Sources/Business/DbData.Runes.cs | 65 +++++++++++ .../Sources/Business/DbData.Skins.cs | 65 +++++++++++ .../Sources/Business/DbData.cs | 23 ++++ .../Sources/LeagueOfLegends.sln | 9 +- 7 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 EntityFramework_LoL/Sources/Business/Business.csproj create mode 100644 EntityFramework_LoL/Sources/Business/DbData.Champions.cs create mode 100644 EntityFramework_LoL/Sources/Business/DbData.RunePages.cs create mode 100644 EntityFramework_LoL/Sources/Business/DbData.Runes.cs create mode 100644 EntityFramework_LoL/Sources/Business/DbData.Skins.cs create mode 100644 EntityFramework_LoL/Sources/Business/DbData.cs diff --git a/EntityFramework_LoL/Sources/Business/Business.csproj b/EntityFramework_LoL/Sources/Business/Business.csproj new file mode 100644 index 0000000..ac52241 --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/Business.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/EntityFramework_LoL/Sources/Business/DbData.Champions.cs b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs new file mode 100644 index 0000000..a7bdf5e --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs @@ -0,0 +1,105 @@ +using Model; +using Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Business +{ + public partial class DbData + { + public class ChampionsManager : IChampionsManager + { + private readonly DbData parent; + + public ChampionsManager(DbData parent) + => this.parent = parent; + + public Task AddItem(Champion? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(Champion? item) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByCharacteristic(string charName) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByClass(ChampionClass championClass) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByRunePage(RunePage? runePage) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsBySkill(Skill? skill) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsBySkill(string skill) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(Champion? oldItem, Champion? newItem) + { + throw new NotImplementedException(); + } + } + } diff --git a/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs new file mode 100644 index 0000000..bf1aa5d --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs @@ -0,0 +1,75 @@ +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Business +{ + public partial class DbData + { + public class RunePagesManager : IRunePagesManager + { + private readonly DbData parent; + + public RunePagesManager(DbData parent) + => this.parent = parent; + + public Task AddItem(RunePage? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(RunePage? item) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByRune(Model.Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByChampion(Champion? champion) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByRune(Model.Rune? rune) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(RunePage? oldItem, RunePage? newItem) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/EntityFramework_LoL/Sources/Business/DbData.Runes.cs b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs new file mode 100644 index 0000000..e0e796c --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs @@ -0,0 +1,65 @@ +using Model; +using Shared; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Business +{ + public partial class DbData + { + public class RunesManager : IRunesManager + { + private readonly DbData parent; + + public RunesManager(DbData parent) + => this.parent = parent; + public Task AddItem(Model.Rune? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(Model.Rune? item) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByFamily(RuneFamily family) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(Model.Rune? oldItem, Model.Rune? newItem) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/EntityFramework_LoL/Sources/Business/DbData.Skins.cs b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs new file mode 100644 index 0000000..7988141 --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs @@ -0,0 +1,65 @@ +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Business +{ + public partial class DbData + { + public class SkinsManager : ISkinsManager + { + private readonly DbData parent; + + public SkinsManager(DbData parent) + => this.parent = parent; + + public Task AddItem(Skin? item) + { + throw new NotImplementedException(); + } + + public Task DeleteItem(Skin? item) + { + throw new NotImplementedException(); + } + + public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + { + throw new NotImplementedException(); + } + + public Task GetNbItems() + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByChampion(Champion? champion) + { + throw new NotImplementedException(); + } + + public Task GetNbItemsByName(string substring) + { + throw new NotImplementedException(); + } + + public Task UpdateItem(Skin? oldItem, Skin? newItem) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/EntityFramework_LoL/Sources/Business/DbData.cs b/EntityFramework_LoL/Sources/Business/DbData.cs new file mode 100644 index 0000000..708039d --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/DbData.cs @@ -0,0 +1,23 @@ +using Model; + +namespace Business +{ + public partial class DbData : IDataManager + { + + public DbData() + { + ChampionsMgr = new ChampionsManager(this); + SkinsMgr = new SkinsManager(this); + RunesMgr = new RunesManager(this); + RunePagesMgr = new RunePagesManager(this); + } + public IChampionsManager ChampionsMgr { get; } + + public ISkinsManager SkinsMgr { get; } + + public IRunesManager RunesMgr { get; } + + public IRunePagesManager RunePagesMgr { get; } + } +} \ No newline at end of file diff --git a/EntityFramework_LoL/Sources/LeagueOfLegends.sln b/EntityFramework_LoL/Sources/LeagueOfLegends.sln index 5e32aeb..5abb419 100644 --- a/EntityFramework_LoL/Sources/LeagueOfLegends.sln +++ b/EntityFramework_LoL/Sources/LeagueOfLegends.sln @@ -21,7 +21,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DTO", "DTO\DTO.csproj", "{7 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Entity Framework", "Entity Framework", "{BC2FFCA4-3801-433F-A83E-B55345F3B31E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Entities", "Entities\Entities.csproj", "{C463E2E1-237A-4339-A4C4-6EA3BE7002AE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Entities", "Entities\Entities.csproj", "{C463E2E1-237A-4339-A4C4-6EA3BE7002AE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Business", "Business\Business.csproj", "{A447B0BE-62AE-4F66-B887-D1F3D46B0DB3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -57,6 +59,10 @@ Global {C463E2E1-237A-4339-A4C4-6EA3BE7002AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {C463E2E1-237A-4339-A4C4-6EA3BE7002AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {C463E2E1-237A-4339-A4C4-6EA3BE7002AE}.Release|Any CPU.Build.0 = Release|Any CPU + {A447B0BE-62AE-4F66-B887-D1F3D46B0DB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A447B0BE-62AE-4F66-B887-D1F3D46B0DB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A447B0BE-62AE-4F66-B887-D1F3D46B0DB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A447B0BE-62AE-4F66-B887-D1F3D46B0DB3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -65,6 +71,7 @@ Global {1889FA6E-B7C6-416E-8628-9449FB9070B9} = {C76D0C23-1FFA-4963-93CD-E12BD643F030} {B01D7EF2-2D64-409A-A29A-61FB7BB7A9DB} = {2C607793-B163-4731-A4D1-AFE8A7C4C170} {C463E2E1-237A-4339-A4C4-6EA3BE7002AE} = {BC2FFCA4-3801-433F-A83E-B55345F3B31E} + {A447B0BE-62AE-4F66-B887-D1F3D46B0DB3} = {BC2FFCA4-3801-433F-A83E-B55345F3B31E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {92F3083D-793F-4552-8A9A-0AD6534159C9} From 0b1090aab5caff008ed63f1dacf72b22516b676a Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Wed, 1 Mar 2023 17:17:15 +0100 Subject: [PATCH 2/4] Starting DbDataManager implementation --- .vs/League-of-Legends_Project3/v17/.wsuo | Bin 18944 -> 18944 bytes .../API_LoL_Project/API_LoL_Project.csproj | 1 + .../Controllers/ChampionsController.cs | 8 +- .../API_LoL_Project/Mapper/ChampionMapper.cs | 30 ++++-- .../API_LoL_Project/Mapper/RuneMapper.cs | 27 +++++ .../API_LoL_Project/Mapper/RunePageMapper.cs | 19 ++++ .../API_LoL_Project/Mapper/SkinMapper.cs | 23 ++++ .../Sources/Business/Business.csproj | 2 + .../Sources/Business/DbData.Champions.cs | 100 +++++++++++------- .../Sources/Business/DbData.RunePages.cs | 65 +++++++----- .../Sources/Business/DbData.Runes.cs | 55 +++++----- .../Sources/Business/DbData.Skins.cs | 56 +++++----- .../Sources/Business/DbData.cs | 9 +- .../Sources/Entities/ChampionEntity.cs | 9 +- .../Sources/Entities/CharacteristicEntity.cs | 28 +++++ .../Sources/Entities/Entities.Champions.db | Bin 81920 -> 110592 bytes .../Entities/Entities.Champions.db-shm | Bin 32768 -> 32768 bytes .../Sources/Entities/Entities.csproj | 2 +- .../{ChampionDbContext.cs => LolDbContext.cs} | 18 +++- .../Sources/Entities/Program.cs | 2 +- .../Sources/Entities/RunePageEntity.cs | 2 +- 21 files changed, 319 insertions(+), 137 deletions(-) create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RuneMapper.cs create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RunePageMapper.cs create mode 100644 EntityFramework_LoL/Sources/API_LoL_Project/Mapper/SkinMapper.cs create mode 100644 EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs rename EntityFramework_LoL/Sources/Entities/{ChampionDbContext.cs => LolDbContext.cs} (86%) diff --git a/.vs/League-of-Legends_Project3/v17/.wsuo b/.vs/League-of-Legends_Project3/v17/.wsuo index 80c36fce6bc5f9b6f5a1fd8186a6fd6e3ad06882..4fd9423cf4beeeec79397892c1e93236b5e96228 100644 GIT binary patch delta 965 zcmZpe!q_l{aYGIhTfpSm*4{pwiJd+bxbQt+27qUoiOo(8d#FWEk;0iI2Z5pGmAW->VpmvaPAOJEN z!h(?8Kt4a37#oz&1*Bp6gn(?3&7mCcS$SlTlus7qSDAdkjAe2KpEobqZ4yvfu*?^} z3p^l)%b^JJ2T*Fp<}ZRQjEq8?e+qdq@q+y$jBLXJBcOvs&rEg^v76i^<_J*%3OtaX zAr2Gs=Vb)(B#}fnmx!NdD3KLjpwY0*@lpwQ#`$3PAs9o*~uWKEQxCm~6nr!YDEMr|KzQMo=1- zg&L06Hb#-jKjn{O3xdrK`W%cLFc*RiDG>_b0hx*%BdjJs0nCutTw)l?rea`fY-*5X zo}!y#kYucDl5Ciyo0w>1tZSZXX<=b(m~5Gvn!Nd~`CU$B^Q6>7lVl5B6Js+oT@%Yx cGu@;_OJiLlvt&z?G!uig#3aMbZykj>04DN!5&!@I delta 897 zcmbVKJ#W)c6wP%V*8w|eKH9Vx+(M(O6}9Rlb`m3y8mR-Km6D|r8*O7}>H^BpF^GW$ zG2~Xv46H~+?+*l}5~x%ne}JD*v1Et`2>0bfa%mTM()D{j_uhBTJMT4*p?M4^hl2F} zky-r_G#}a zw1h*c`E0bQ^bXckD*r{LlNP@Huy_2qN&mAP!?Ku+^QzRiB2Kf!cIBU8g=^8qFvepU zY!^g4if*gG6)glay=WIt1rvL*>VLGcUR(r-FhB7`P=QOFSTLf^5$)``!Uf+6vNq-_ zDkKTH9YlL`73>IE)<}N`6&5M=_ipTHVFwhQGIs-wEnCF?tsNyz*irz;rbYZ(Ri0Qx zqE=y^`O9aZ4qfG!!&P&&VeZ%z^R+Jmwrv@|>gDO=>y^{~gAe#pH*s^Li!=95U0-S^LI1OOK$Xx34=U+uV>rzI<7U>QHO&MTIRAfAzquk=>OtHMijA z^Lfvxmz=s`6|B5*Q1o&}-Kl%_elDA}ydt|O{)jBQIp@Htd4^ka3Wnvmu2Hh;1;ftm QJ0-j1SoxaCF3L&y55|d1a{vGU diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj b/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj index d0782fd..f2b6d61 100644 --- a/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj +++ b/EntityFramework_LoL/Sources/API_LoL_Project/API_LoL_Project.csproj @@ -12,6 +12,7 @@ + diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/ChampionsController.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/ChampionsController.cs index 98c9a35..49c3f0e 100644 --- a/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/ChampionsController.cs +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Controllers/ChampionsController.cs @@ -21,7 +21,7 @@ namespace API_LoL_Project.Controllers { var champions = await dataManager.GetItems(0, await dataManager.GetNbItems()); - return Ok(new { result = champions.Select(c => c.toDTO())}); + return Ok(new { result = champions.Select(c => c.ToDTO())}); } @@ -32,14 +32,14 @@ namespace API_LoL_Project.Controllers var champion = await dataManager .GetItemsByName(name, 0, await dataManager.GetNbItems()); - return Ok(new { result = champion.First().toDTO() }); + return Ok(new { result = champion.First().ToDTO() }); } // POST api/ [HttpPost] public async Task Post([FromBody] ChampionDTO value) { - await dataManager.AddItem(value.toModel()); + await dataManager.AddItem(value.ToModel()); return Ok(); } @@ -50,7 +50,7 @@ namespace API_LoL_Project.Controllers { var champion = await dataManager .GetItemsByName(name, 0, await dataManager.GetNbItems()); - await dataManager.UpdateItem(champion.First(), value.toModel()); + await dataManager.UpdateItem(champion.First(), value.ToModel()); return Ok(); } diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/ChampionMapper.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/ChampionMapper.cs index 6d16cac..b2a7dcd 100644 --- a/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/ChampionMapper.cs +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/ChampionMapper.cs @@ -1,21 +1,39 @@ using DTO; +using Entities; using Model; namespace API_LoL_Project.Mapper { - public static class ChampionMapper - { - public static ChampionDTO toDTO(this Champion item) + public static class ChampionMapper { + + public static ChampionDTO ToDTO(this Champion item) { - return new ChampionDTO() { + return new() { Name = item.Name, Bio = item.Bio }; } - public static Champion toModel(this ChampionDTO dto) + public static ChampionEntity ToEntity(this Champion item) { - return new Champion(dto.Name); + return new() + { + Name = item.Name, + Bio = item.Bio, + Icon = item.Icon, + Class = item.Class, + Image = new() { Base64 = item.Image.Base64 }, + }; + } + + public static Champion ToModel(this ChampionDTO dto) + { + return new(dto.Name); + } + + public static Champion ToModel(this ChampionEntity entity) + { + return new(entity.Name, entity.Class, entity.Icon, entity.Image.Base64, entity.Bio); } } diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RuneMapper.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RuneMapper.cs new file mode 100644 index 0000000..3b2b752 --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RuneMapper.cs @@ -0,0 +1,27 @@ +namespace API_LoL_Project.Mapper +{ + using DTO; + using Entities; + using Model; + + namespace API_LoL_Project.Mapper + { + public static class RuneMapper + { + public static RuneEntity ToEntity(this Rune item) + { + throw new NotImplementedException(); + } + + + public static Rune ToModel(this RuneEntity entity) + { + throw new NotImplementedException(); + + } + + } + } +} + +} diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RunePageMapper.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RunePageMapper.cs new file mode 100644 index 0000000..611ed6e --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/RunePageMapper.cs @@ -0,0 +1,19 @@ +using Entities; +using Model; + +namespace API_LoL_Project.Mapper +{ + public static class RunePageMapper + { + public static RunePageEntity ToEntity(this RunePage item) + { + throw new NotImplementedException(); + } + + public static RunePage ToModel(this RunePageEntity entity) + { + throw new NotImplementedException(); + + } + } +} diff --git a/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/SkinMapper.cs b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/SkinMapper.cs new file mode 100644 index 0000000..ad5a96b --- /dev/null +++ b/EntityFramework_LoL/Sources/API_LoL_Project/Mapper/SkinMapper.cs @@ -0,0 +1,23 @@ +using DTO; +using Entities; +using Model; + +namespace API_LoL_Project.Mapper +{ + public static class SkinMapper + { + public static SkinEntity ToEntity(this Skin item) + { + throw new NotImplementedException(); + } + + + public static Skin ToModel(this SkinEntity entity) + { + throw new NotImplementedException(); + + } + + } +} +} diff --git a/EntityFramework_LoL/Sources/Business/Business.csproj b/EntityFramework_LoL/Sources/Business/Business.csproj index ac52241..ac7fce7 100644 --- a/EntityFramework_LoL/Sources/Business/Business.csproj +++ b/EntityFramework_LoL/Sources/Business/Business.csproj @@ -7,6 +7,8 @@ + + diff --git a/EntityFramework_LoL/Sources/Business/DbData.Champions.cs b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs index a7bdf5e..03d2ff8 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Champions.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs @@ -1,10 +1,7 @@ -using Model; +using API_LoL_Project.Mapper; +using Model; using Shared; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Data.SqlTypes; namespace Business { @@ -17,89 +14,112 @@ namespace Business public ChampionsManager(DbData parent) => this.parent = parent; - public Task AddItem(Champion? item) + public async Task AddItem(Champion? item) { - throw new NotImplementedException(); + await parent.DbContext.champions.AddAsync(item.ToEntity()); + return item; } - public Task DeleteItem(Champion? item) + public async Task DeleteItem(Champion? item) { - throw new NotImplementedException(); + parent.DbContext.champions.Remove(item.ToEntity()); + return true; } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Select(c =>c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Characteristics.Any(ch => ch.Name.Equals(charName))) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Class.Equals(championClass)) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Name.Contains(substring)) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity()) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => skill!=null && c.Skills.Any(s => s.Name.Equals(skill.Name))) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill))) + .Select(c => c.ToModel()) + .Skip(index * count).Take(count); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + return parent.DbContext.champions.Count(); } - public Task GetNbItemsByCharacteristic(string charName) + public async Task GetNbItemsByCharacteristic(string charName) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Characteristics.Any(ch => ch.Name.Equals(charName))).Count(); } - public Task GetNbItemsByClass(ChampionClass championClass) + public async Task GetNbItemsByClass(ChampionClass championClass) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Class.Equals(championClass)) + .Count(); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.Name.Contains(substring)) + .Count(); } - public Task GetNbItemsByRunePage(RunePage? runePage) + public async Task GetNbItemsByRunePage(RunePage? runePage) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity()))).Count(); + } - public Task GetNbItemsBySkill(Skill? skill) + public async Task GetNbItemsBySkill(Skill? skill) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill.Name))) + .Count(); } - public Task GetNbItemsBySkill(string skill) + public async Task GetNbItemsBySkill(string skill) { - throw new NotImplementedException(); + return parent.DbContext.champions.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill))) + .Count(); } - public Task UpdateItem(Champion? oldItem, Champion? newItem) + public async Task UpdateItem(Champion? oldItem, Champion? newItem) { - throw new NotImplementedException(); + parent.DbContext.champions.Remove(oldItem.ToEntity()); + parent.DbContext.champions.Add(newItem.ToEntity()); + return newItem; } } } +} diff --git a/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs index bf1aa5d..b7ea7fc 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs @@ -1,9 +1,5 @@ -using Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using API_LoL_Project.Mapper; +using Model; namespace Business { @@ -16,59 +12,72 @@ namespace Business public RunePagesManager(DbData parent) => this.parent = parent; - public Task AddItem(RunePage? item) + public async Task AddItem(RunePage? item) { - throw new NotImplementedException(); + await parent.DbContext.runepages.AddAsync(item.ToEntity()); + return item; } - public Task DeleteItem(RunePage? item) + public async Task DeleteItem(RunePage? item) { - throw new NotImplementedException(); + parent.DbContext.runepages.Remove(item.ToEntity()); + return true; } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Select(rp => rp.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.champions.Any(c => c.Name.Equals(champion.Name))) + .Select(rp => rp.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.Name.Contains(substring)) + .Select(rp => rp.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByRune(Model.Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.runes.Any(r => r.Name.Equals(rune.Name))) + .Select(rp => rp.ToModel()) + .Skip(index * count).Take(count); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + return parent.DbContext.runepages.Count(); + } - public Task GetNbItemsByChampion(Champion? champion) + public async Task GetNbItemsByChampion(Champion? champion) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.champions.Any(c => c.Name.Equals(champion.Name))).Count(); + } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.Name.Contains(substring)).Count(); } - public Task GetNbItemsByRune(Model.Rune? rune) + public async Task GetNbItemsByRune(Model.Rune? rune) { - throw new NotImplementedException(); + return parent.DbContext.runepages.Where(rp => rp.runes.Any(r => r.Name.Equals(rune.Name))).Count(); } - public Task UpdateItem(RunePage? oldItem, RunePage? newItem) + public async Task UpdateItem(RunePage? oldItem, RunePage? newItem) { - throw new NotImplementedException(); + parent.DbContext.runepages.Remove(oldItem.ToEntity()); + parent.DbContext.runepages.Add(newItem.ToEntity()); + return newItem; } } } diff --git a/EntityFramework_LoL/Sources/Business/DbData.Runes.cs b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs index e0e796c..bcd964f 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Runes.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs @@ -1,10 +1,7 @@ -using Model; +using API_LoL_Project.Mapper; +using API_LoL_Project.Mapper.API_LoL_Project.Mapper; +using Model; using Shared; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Business { @@ -16,49 +13,59 @@ namespace Business public RunesManager(DbData parent) => this.parent = parent; - public Task AddItem(Model.Rune? item) + public async Task AddItem(Rune? item) { - throw new NotImplementedException(); + await parent.DbContext.runes.AddAsync(item.ToEntity()); + return item; } - public Task DeleteItem(Model.Rune? item) + public async Task DeleteItem(Rune? item) { - throw new NotImplementedException(); + parent.DbContext.runes.Remove(item.ToEntity()); + return true; } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runes + .Select(r => r.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runes.Where(r => r.RuneFamily.Equals(family)) + .Select(r => r.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.runes.Where(r => r.Name.Contains(substring)) + .Select(r => r.ToModel()) + .Skip(index * count).Take(count); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + return parent.DbContext.runes.Count(); } - public Task GetNbItemsByFamily(RuneFamily family) + public async Task GetNbItemsByFamily(RuneFamily family) { - throw new NotImplementedException(); + return parent.DbContext.runes.Where(r => r.RuneFamily.Equals(family)).Count(); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + return parent.DbContext.runes.Where(r => r.Name.Contains(substring)).Count(); } - public Task UpdateItem(Model.Rune? oldItem, Model.Rune? newItem) + public async Task UpdateItem(Rune? oldItem, Rune? newItem) { - throw new NotImplementedException(); + parent.DbContext.runes.Remove(oldItem.ToEntity()); + parent.DbContext.runes.Add(newItem.ToEntity()); + return newItem; } } } diff --git a/EntityFramework_LoL/Sources/Business/DbData.Skins.cs b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs index 7988141..4a0a965 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Skins.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs @@ -1,9 +1,5 @@ -using Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using API_LoL_Project.Mapper; +using Model; namespace Business { @@ -16,49 +12,61 @@ namespace Business public SkinsManager(DbData parent) => this.parent = parent; - public Task AddItem(Skin? item) + public async Task AddItem(Skin? item) { - throw new NotImplementedException(); + await parent.DbContext.skins.AddAsync(item.ToEntity()); + return item; } - public Task DeleteItem(Skin? item) + public async Task DeleteItem(Skin? item) { - throw new NotImplementedException(); + parent.DbContext.skins.Remove(item.ToEntity()); + return true; } - public Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.skins + .Select(s => s.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.skins.Where(s => s.Champion.Name.Equals(champion.Name)) + .Select(s => s.ToModel()) + .Skip(index * count).Take(count); } - public Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) + public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - throw new NotImplementedException(); + return parent.DbContext.skins.Where(s => s.Name.Contains(substring)) + .Select(s => s.ToModel()) + .Skip(index * count).Take(count); } - public Task GetNbItems() + public async Task GetNbItems() { - throw new NotImplementedException(); + return parent.DbContext.skins.Count(); } - public Task GetNbItemsByChampion(Champion? champion) + public async Task GetNbItemsByChampion(Champion? champion) { - throw new NotImplementedException(); + return parent.DbContext.skins.Where(s => s.Champion.Name.Equals(champion.Name)) + .Count(); } - public Task GetNbItemsByName(string substring) + public async Task GetNbItemsByName(string substring) { - throw new NotImplementedException(); + return parent.DbContext.skins.Where(s => s.Name.Contains(substring)) + .Count(); } - public Task UpdateItem(Skin? oldItem, Skin? newItem) + public async Task UpdateItem(Skin? oldItem, Skin? newItem) { - throw new NotImplementedException(); + parent.DbContext.skins.Remove(oldItem.ToEntity()); + parent.DbContext.skins.Add(newItem.ToEntity()); + return newItem; } } } diff --git a/EntityFramework_LoL/Sources/Business/DbData.cs b/EntityFramework_LoL/Sources/Business/DbData.cs index 708039d..99c30e9 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.cs @@ -1,17 +1,22 @@ -using Model; +using Entities; +using Microsoft.EntityFrameworkCore; +using Model; namespace Business { public partial class DbData : IDataManager { - public DbData() + public DbData(LolDbContext dbContext) { + DbContext = dbContext; ChampionsMgr = new ChampionsManager(this); SkinsMgr = new SkinsManager(this); RunesMgr = new RunesManager(this); RunePagesMgr = new RunePagesManager(this); } + protected LolDbContext DbContext{ get; } + public IChampionsManager ChampionsMgr { get; } public ISkinsManager SkinsMgr { get; } diff --git a/EntityFramework_LoL/Sources/Entities/ChampionEntity.cs b/EntityFramework_LoL/Sources/Entities/ChampionEntity.cs index 5e3101a..42c060c 100644 --- a/EntityFramework_LoL/Sources/Entities/ChampionEntity.cs +++ b/EntityFramework_LoL/Sources/Entities/ChampionEntity.cs @@ -1,4 +1,5 @@ using Shared; +using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -15,14 +16,12 @@ namespace Entities public string? Icon { get; set; } [Required] public ChampionClass Class { get; set;} - public virtual ICollection? Skills { get; set; } + public virtual ICollection Skills { get; set; } + public virtual ICollection Characteristics { get; set; } + public ICollection runepages { get; set; } public Guid? ImageId { get; set; } - [ForeignKey("ImageId")] public LargeImageEntity? Image { get; set; } - - - } } diff --git a/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs b/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs new file mode 100644 index 0000000..8ad635c --- /dev/null +++ b/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Entities +{ + public class CharacteristicEntity + { + [Key] + [MaxLength(256)] + public string Name { get; set; } + + [Required] + public int Value { get; set; } + + [Required] + public string ChampionForeignKey { get; set; } + + [Key] + [Required] + [ForeignKey("ChampionForeignKey")] + public ChampionEntity Champion { get; set; } + } +} \ No newline at end of file diff --git a/EntityFramework_LoL/Sources/Entities/Entities.Champions.db b/EntityFramework_LoL/Sources/Entities/Entities.Champions.db index 5847519f33f10f07991fe63c42421d6b8cbacc6f..1c7c62bb20936b0f9beb7ac33bc42d9d9ec903f8 100644 GIT binary patch literal 110592 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 delta 1128 zcma)6eP|PB7{BLoxy#4h`y@@XON^Q`n=_TBYx)&Ch?;hX6jN6^!3`-{Y=bSUu{05u zePB~6`&W6vtF@*0_0L2q-XDS>W9ZzIT;>A&J&yc>*OVHWSDeb6yj}j? zyVtwyKI;uiaknm96n}L*b!7N^X2#dX^Ob-xI}MFcXDm)bwzs;oPErr0q1roA94dU? z^Kq{KM6sY3%OmBArS;{Hu3EWqW|j`*j}VSBc6H*Q^`y|`$_J#E9d7|dp`?aU>ujW#L|wq+fX z8jZr_QM+z%IDc$x11a0POcHVS zcwN>5R+z{{2FRG8cul4;ig$|@py;BCwPasZ=$q=cLw)yKo{p@QXM$MVGhja^M0Qx z^gY0))UH%ZXIDl~ba%EU6K$DPd!n#hCl493{Q&n0i{{S)8& z9~IVEJl^NdHH=CJ+;mfD|@=TZ#K_)CA2GYA>T_`#^kuiNhDT#F|<^ ihQJ#;GM%j2R?Pc`cr5?TtPidt{dXY<9usOS(f91 diff --git a/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-shm b/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-shm index be1302a557fa43b70c65f795a052420bbca6facd..559b34c146234d314364ab8716809d95949fd17d 100644 GIT binary patch delta 93 zcmZo@U}|V!;*@x#%K!!wIpqcYW(oezD8HeMET{_;1kwMI07R650W3f9toOzX G2K4~uVI7 - + diff --git a/EntityFramework_LoL/Sources/Entities/ChampionDbContext.cs b/EntityFramework_LoL/Sources/Entities/LolDbContext.cs similarity index 86% rename from EntityFramework_LoL/Sources/Entities/ChampionDbContext.cs rename to EntityFramework_LoL/Sources/Entities/LolDbContext.cs index e28b10f..52b49a5 100644 --- a/EntityFramework_LoL/Sources/Entities/ChampionDbContext.cs +++ b/EntityFramework_LoL/Sources/Entities/LolDbContext.cs @@ -6,10 +6,11 @@ using System.Xml.Linq; namespace Entities { - public class ChampionDbContext : DbContext + public class LolDbContext : DbContext { public DbSet skins { get; set; } public DbSet champions { get; set; } + public DbSet characteristics { get; set; } public DbSet skills { get; set; } public DbSet runes { get; set; } public DbSet runepages { get; set; } @@ -58,6 +59,21 @@ namespace Entities } }); + modelBuilder.Entity().HasData(new List() { + new() + { + Name = "Force", + Value = 50, + ChampionForeignKey = "Dave", + }, + new() + { + Name = "Défense", + Value = 75, + ChampionForeignKey = "Armure", + } + }); + modelBuilder.Entity().HasData(new List() { new SkinEntity { diff --git a/EntityFramework_LoL/Sources/Entities/Program.cs b/EntityFramework_LoL/Sources/Entities/Program.cs index 6e4348a..13fdf1b 100644 --- a/EntityFramework_LoL/Sources/Entities/Program.cs +++ b/EntityFramework_LoL/Sources/Entities/Program.cs @@ -7,7 +7,7 @@ ChampionEntity imri = new() Bio = "Fou Furieux", Class = ChampionClass.Assassin }; -using (var context = new ChampionDbContext()) +using (var context = new LolDbContext()) { // Crée des nounours et les insère dans la base Console.WriteLine("Creates and inserts new Champion"); diff --git a/EntityFramework_LoL/Sources/Entities/RunePageEntity.cs b/EntityFramework_LoL/Sources/Entities/RunePageEntity.cs index ce2ae88..1c248ab 100644 --- a/EntityFramework_LoL/Sources/Entities/RunePageEntity.cs +++ b/EntityFramework_LoL/Sources/Entities/RunePageEntity.cs @@ -10,7 +10,6 @@ namespace Entities { public class RunePageEntity { - [Key] public Guid Id { get; set; } @@ -18,6 +17,7 @@ namespace Entities public string Name { get; set; } public ICollection runes { get; set; } + public ICollection champions { get; set; } } From 9ed397d7d77f70c8f4035b7288a9cd7f34e5a5e9 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Wed, 1 Mar 2023 17:30:11 +0100 Subject: [PATCH 3/4] Correcting CharacteristicEntity --- .../Sources/Business/DbData.Champions.cs | 2 +- .../Sources/Entities/CharacteristicEntity.cs | 2 - .../Entities/Entities.Champions.db-shm | Bin 32768 -> 32768 bytes .../Entities/Entities.Champions.db-wal | Bin 3205392 -> 1067112 bytes .../Sources/Entities/LolDbContext.cs | 7 ++ ...230301162639_myFirstMigration.Designer.cs} | 87 +++++++++++++++++- ....cs => 20230301162639_myFirstMigration.cs} | 72 ++++++++++++++- ...apshot.cs => LolDbContextModelSnapshot.cs} | 87 +++++++++++++++++- 8 files changed, 244 insertions(+), 13 deletions(-) rename EntityFramework_LoL/Sources/Entities/Migrations/{20230209133904_myFirstMigration.Designer.cs => 20230301162639_myFirstMigration.Designer.cs} (77%) rename EntityFramework_LoL/Sources/Entities/Migrations/{20230209133904_myFirstMigration.cs => 20230301162639_myFirstMigration.cs} (77%) rename EntityFramework_LoL/Sources/Entities/Migrations/{ChampionDbContextModelSnapshot.cs => LolDbContextModelSnapshot.cs} (77%) diff --git a/EntityFramework_LoL/Sources/Business/DbData.Champions.cs b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs index 03d2ff8..52bfe7f 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Champions.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Champions.cs @@ -55,7 +55,7 @@ namespace Business public async Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity()) + return parent.DbContext.champions.Where(c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity()))) .Select(c => c.ToModel()) .Skip(index * count).Take(count); } diff --git a/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs b/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs index 8ad635c..e780845 100644 --- a/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs +++ b/EntityFramework_LoL/Sources/Entities/CharacteristicEntity.cs @@ -20,8 +20,6 @@ namespace Entities [Required] public string ChampionForeignKey { get; set; } - [Key] - [Required] [ForeignKey("ChampionForeignKey")] public ChampionEntity Champion { get; set; } } diff --git a/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-shm b/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-shm index 559b34c146234d314364ab8716809d95949fd17d..927dd669d3b534d572ef7d952d8d09e65a5e92e1 100644 GIT binary patch literal 32768 zcmeI5XLJ=+6otPefD|L42%*V~qS&x^MKN~ly*ChhL9r{MqF}*ZP!ud!u`3op#EMw3 z3-%Iw1$!6IksO>KlC`oRGkGt2*4i)c-h1ZmeZHCZGc)B?J@BKesR+tS?4!cISCsaw z8e3U9VD$8%!zPUwGH_aD_ugYBPUv4=%X;7258roI;+Q@A-={6Jkg26vQ~1W-aem|ukLWM*4fm>w1~;CQ_fUj^8B%@o~-+ z8R`>j&*%3++@HZZ=KOkj|NqB2?%lX1ab2U&VD0O{F<6IR+#@~?j=?%=g0+uxCeIVB zqb7bEK6c)bA#2taMTZE8fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%) zfCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCz|y2#A0Ph=2%)fCv-> zfl?~jhcg(-?L5q{1<_O8G*M*Ff@o#Wi|AA_a)z-}DCq4eh%PT&+y=PYjJ zF7D@Xp5{4T;x*pnT|TOtNZNHC33Olswq;*N@jSoH<6eb*`f{Aj$A#TugX^xbJrQO@ zj^rAq@_U2pzBUan&pCWjn-f%9?+LVI88+f5uH_Ey<&S!wH@kqXS%JeimnnRjT?jeP zR{~AgnC;kw>$sEqn8;H+%L}~9bl%|u{+zE~`Mp^iR^)Jo@eH5kcOyzahd>$2vI*O> zD}6YaBN)K(oXlyQ$@M(Khx|3CvY~(J#7Z2?dA!W$4IM?n^uH;68O>P!E|`w$s*%pD z%yFF0D|}H`7TPyu0-LcPhj0Uvn3b|~zS(tS6$WtuZ}DZmMOWUr5a`X(+{mL$p8c5D zxm0Ny7H3sX*0-H0Cn|P5Tf5fql8VEFHHFoDB9^mU5sg>VAJjgdS)@d<+2yDsz4CNLcqw3!`Oyp1Uw3Bva4Nl||Ugz7it>q^I z8578{CMR(z)0mNQ64{GD+60POi>QPKi9m(~ z+OZycaS$UI$CLb&VG>!3K-vV_(~G?s%vFr%J$_ExUVb8wA%RBrUiY^49`!CP$`UNi S`s~crOyGTf$uL!YwEhRAcefM( literal 32768 zcmeI51&|fT8img}xC9HbxI-YgySoNYaCdiy;30wF4haNz3-0dj?(Xhn<|SR+Y;97T zNA}g@ZckO$-tPJPpZ|P)`qom#^!i*%33CyM5IP7D(-}DbCTXE**;-UdQ##wAf)Sdg zFEuXW>xLapB=q@*@oql%a(}+}xPBk~ecb&V)M>$-=G5?~&vN>13jf~sZ`{W|C%98n z2&aW~nrANG zw1#j_p70*|+~>PvrZ)Gvre@Dr!^p%MeWvf%oR6u^Ff+9pKNxPFwHbCM)?G`tKGXMW z&VO551SfAqr@6dL4eppHKU2GBtf|q&ni@^t)M)yC<@nf|BRO?`?zG5%)NAT<$Nj3` z9XGK?tI6TU8%<`u(Pa8Ylj$2xZr|h$C{3=;ztUvx8BLx{j3yIfG?~89Wcr?(%veBa zG91lb@ax$|lP6=N$;>yJOy6iSeZTSslqSQ>KbqWF;~S&N%r}}$-)J)Z|D`6w(Lb8p zSl^n=e51+qjV99%C{6CZF+Os?Bh2%B>v6va%{{Xortja{J#$!({h7OAV|*XQ;T_d! z(VXV4k>~ff8S}kH?s|C6G3)A%d*(IsJ=f8U`FAbNv)tPL&9!uO`_^mrwO@Koyrg!tt`{U$=PgzMo*B-=q7d?#g&T16+AU5J5F}^?= zWI}cnK`E3)B~(Qdv_N}wMtAhaFpR=POvW_K#%ip`HtfPa9Kvzj#(g})YrIDghG1C6 zV^IGuC2o}0Og`+1nhd72mah|l?s zQgDSrM3h8(DdKA3|O_>B43fpdA05mZpUwMq{I zm3#gc*e7r^g!Q~XS1F|P9()WWKyu_nb@attoJ2V0XGhNCB}P;s_0eiQvhMdM&;N(8 zkkGZ(<`C6+vpx66uizc~A_cQ668T7MfxJCSd`#;|$&)BGa-E>$3~Tb0H7#D&I4* zGN`CpslR4voi6C9b-OoNA`odwg$&4wy!Z;W(E;D#CoIGcoW)y2VmcOP19s&EF5*F6 zBNRm$RZOilK(n=87xm2gJ`j1u`=q8uMr1=iltCSI#6V2JBJ9RF=b*IDnUO`fTrEXE$32N{`}Sd>lJoj-F4 zkMahCDw?vYggR)T=4+#_>V@@vAaaSfN-com_y+aR6+d7sreg{A;{t**3bV2po3jUh z;ZmO9O@@$w7KICf(3Wy92z{7J)=pL6ksc)JJRdz#xpn3@pU~TtqNNWi}RP z3-;tx{>qcQ#gK}woGPU*`az4eSvU2{`ah8P#5-jcLPaz{8}!6r49Bn7gu}RmM+nJi zOv;=r!K!S{Z#k4RxQyF)hPU~OVH88jl}DvjN8L3@Kj~L((J|f8Yr7x3(}7)jy1S~=ZMY}EX7*v%~4#z-Mq`kjHT2n zqel8sQ?*T}_11dbJ8cn2R5eCB^ukb##030|shEWoSc|K8ff!85(yYxs9L<&7!+U(f z*h-_aYOEoertLbTch>!Z#3$YC~EDyX{ZsfpUCqq?f6hHIQAYr5uWftF~wcIlu_=&Ua3 znr`WyX#YQ=w_58H&~+295QhnwoT-?enVFq=SdKN=jsrM|BRGZ=IhoTqn`^m~=NVr~ zlu~JxN!gT3`BhO(HA3UHTZbg;9ry$nXACTEkUPIt(HP+`=@+ur~;&BJd1 diff --git a/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-wal b/EntityFramework_LoL/Sources/Entities/Entities.Champions.db-wal index d2719b5abd4b3fd502dc6237057f86c2a8354294..50a0bc3ea592735653ec46043997d792b8fa7819 100644 GIT binary patch delta 34990 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 KTCj?r=>Gvpz24ve delta 88635 zcmeHQ2V4`)(4{NBY zX{o_t7u;l~zt$kfJ{IkL+YD=B3qIn=fBx#ln>4L1H{-?!Pi{)BI;A`5WN3_{^uY8`nwV}qy+x%HDb9F#K7%47`iIBFMh_VrPyWG?j>$l#X58UviUsw+*^d5ZQj0zu zlguF^Z5B84VDO#HR{5>#gNyOO3l>U8Om}$wHht*q2-p#@@0dEmlA$Axay>m;-Ykaw z01HbNvQm_TWafw1D(#B>Po50a@I3Vb>k8Nk*cC+KU|qpcYZPV-yMiNrgLZ}Z4c--X zVOONss`Jq9sQ0Vxn85{oVb9475!sb?K|^pQq6=W(lS4FZdi;{diziEA7qF3iYDgin zPgbDK+JbPc+3KwgrR_ej&7@in*<9(J#eA!p1QvcQm{`1cU_Uk32W;eo8uAP|0e`m_ zktV-mYf3wPU^mesPOf`)G3(RTwNtV~wA8gsDVVad?b5qdmu{=jz63*1mafzrGP*F- z6v4WZKomT}JL6(q$yJIfv@1b(ZYx7q{t{N^;A%vlQeZXg)2D=QURq}vZg=FSVT{4wM-0v9Cil7gJ*_@)N+PadiZk)w{J zqsT$hf#6O+q^u(Lh+4$xCwJ}qVT#ALI&g^9k>w~ua$%Mn-DhaWTWkd5#vOArfVb&jQ_T3}3Ew7GA1Tteia zfFZ-o1BS&#M-CfV+5)%Vw_y5gk3Qo%KkJX(_dPY_6Y>hV2UX@JL<>>3WXWAaU3y`* zz=RZ-bFTgMW;+N&u`%Zn_Xdt|2zc0-^Zq=<U%Kz z^yx)SvLdqJML>ab3#W`dIL`a$O!F1do>&h;0Lx1aAL~JWsnq0R`ZgEUw>`wQQ-W|^ z8}%z)yMam9+JTEPN{qPO(nyKTxm4I`9Hc)kF-U(P3SAIs@5THqb3$gCHPzJ*iEHi; zvBN=|fv1QozuhcAd*O{~{7 zmEaciI#A1(P__K)UjL<9mY?bNObO7`7@`W`%7I_pp#W#nJ^%xLqrA8 z`OnLbZx((t?T7We5bt>cokFbVh5r&dU;XqN__6Wz%c?-9$EWk2d)_8(19u2ZdC)l} zrT2uBZ>Ch^wd6m$> zPIAqr*esp}6EANsdE*T`SpzYU!#QFATFyqKlEwV@bqJ*It)pkm+AtqA^feG?Iiw@b z;B*Td>nDrZXGyH@o{^Z)Agj&AN?@Hd&UY8|Ka()~;SMIOx1d`Pe06;mbi&x0>PDKF zf`@krUSxgkLpm>S6=k;%YuhR{Bo|o)XNma;zdl>T+EkaPpSeG)4!;pg!`4KXXC%!p z;Wp5R<_B3ts|W2DI=#A@DGM0=z|a&dip#`UwZZGA*?V{CBK zOL`-iFx4pO3So!Pc)eL`;_CG1V*)*F==WO>UC zos$taC^ph#b(&dGO`$hUn#@0Uod4Uzb#9h?bt> zUQD#VKaXjMiYCtvYPaM|C~b(M91jL{S~y`fHbfH8LiEbu2#WzaL{<_)vy1pAN;Ugi zpxL8EIhu!s%{9IFC%|BN^Vy?Bn2r~tI^I56$TRdeVx`oJ9^5x_WMG#tpx_4$iVyR} zgEszy6QUDFwGEGn#J&(o(-v~|IxwG7+dR0fd2Q^(+U7R36)UM-Z+wy_^Q0nRm{bJl zq+%)@-HiHZ~D7J(+&=W1Iv>D%N+!BkaVO!;)xhYUV&k|A(8bgWSg++62R`c z{rwL1&>`w@hT$RFlo<}u2EX`6g2i*{Z{oiu=eQZdw1#RehxCHiVIxYtji$fwHb~8f zv}m+WYv<|JSY2n-kf+EQcz;l|_98q}HrK+Mr6z6X%dTN(z~WjNYO47R88#@=yl5 zEj4|H0YF5KiVRJN4DUP2Jih;sgc>aH1NtX|ApXR4JuEWZyP9y5`Vm@{+%? zM<@vQ^t{t{+{AD1@yU*Y;ykxLgYJ&H5JsEq8fc#iF-rd>qB{ zlN>~FHHzV!tqjF>#sHiTp?&uI*{%{WmUreT0Cb3%BjJkEW ztALbnGpfP*ceJM;7%{?EplHvw=T6pXG%p7I35;SS5EBih4yaJ61IiL*rie^fn!wdOZ6ZkdgU%wE z{NM(##^aXHED}y@L5yYru>B!eeY$7LW1HH&J>@ zX7>clyK|?Y`e&1jO`bbuFGP(`2oTJDftQ6ZLR~`hQV!Kr6JgnhyqVu;4P;|&Rjr5E zM|1eT!G~oU3?AaTeoh7x-+g;omO>-=FHJ!i0{7KC=nDAoMMD(+eX)m7?)aObxXyOg+WwH z+Q@3+BMUxx#yISbq~8PV`j4_wv`>(1A_QeoiXsr{vLfhebFMX@SAy?qAgncbn+OWo^TVJ zw^7uPO}9Q||E67WUwAjLz}v!56SPuv3MR-k)Pq7#qD)6RdQ_hg_Oh*gM4F|9QQl!s zW9#c1*DK-)`bu?Zc;XRw!l!q6EGfm4=s8$ElZLH^M)M^E3(uaD+&O;DGH#ef2_`N(tOp zQqyF3zmAF!fZmQ34FX&o0?@jn55IB<2>&buxFRtBoRS_agHUSpM~hU|DiWbIeO@Mj6K_PW`xnH7=Zl6@miCjBy;n=WsI8 zgs$iv+IUWF*uQPb&3jE1#}n$7y7J>G=Tb6_B{`m8dgs?g-AdeaM@o1b|K#ldZw;vY zL_snAtPs`#=f;ydk%CF5A|)((-Hi!&7C{XZo29OYM;jFu*#O9GGQS*hE<=i?yi0L+2??L-dc3@B!G0I`Eimn z;8$C5Pp(@r+ojZ#`*CSb()`p`XzpxfJ-Oshj{*xl7P{a(9mSIyZn63kd&Zdn2yQk~ zX)la2BL+?4|CGJ7bilkYv|ovyF^{-(M{SVtTHuArMa1kwp4u->oGYZUcfz>dtO3{J zt+6(i)%T*vaQKW-?=SiF?90U789F-nvD5tuG2aW7a-x}cJFidc-=JO$^u5?xROvk$ zy6>9wT;wY_xJ3RY_>+`S@HZi~#F6|CW&?o~e%n(V1F8tGopLv3dvEED-5xx-eo5`n zdh%z-OZzYh*2S*^YlA*rBTRyIE9TST5={DZP=e)sy8k&DHV0io$S}pC4*gI#|5UEN zHp4hek0%$|{#+Z1`PfFJ;oQmUWslX;Wx=3ISlF_f2Y73tf!%@Xn$>g8Eb3U&OG|Np zpdxQf8=&&JX7~V+u36O>pg-Y}dEVHPunKv;gq&zA4iVo@6)b2r_UW2ljrt+XwwbxGwm~#-l8gwRKfsF2QD1!r7+}8@q zG>N`VW{*uh>ROJ1cK{0E=80san@2@qvDpx-lBPOEiYSC?*^Y+7@;P)k3Q33V&!OirbK?%BW8MyKCHtWIa}&*H~rxI zc$Zo%9BWWun_v^54nxgBEDH`OA9L!kYh2cw^7>;RoOd)ly<&xs?3op9p* z(6DobgcDcrmqy$2>P@%D~Mwzn^6O zD(N(+5*An;W#GVj2m%e+w@|hW4bM;q@ZJ*9=XRgZL@LTH9D4`(0W81QM$YfJ*Y=+o z!G@r3h!LbH`6l@~U#2xMZ9vLzd6fLR`F( zKhuWYD_e&*nQfE=vQn8A9*7hvI_bETTvKWOEslsIPI1=Ee0Q$~O8|(vC0v1qp{G%1 zdbCMqH?hz}nBo9(NSU%;_+*YJALe+1sE_^N`I$e&P8JnkOlA#wiU1SE@oRfM?ec@Z z&rs)IAc>RyOy%nXr>&EOYb{U*>vrvnv30u|GEpIW5X+G899o{3@^#I{u~#8h1d`R# z*+p#lyJ@(y=Tgk>R_g4{JgC>uY@6juh}gRru zS+1V?6(qpXEx^~o)!E(F*)71%*2&S`$=1i!$J^Gy&Bf2z-rvQ}-_E%`NUesFqv3dQ(E^9MB&4E2bA!Js6<0 zEKyDKmX1a<8mk8hWJhV)t*33bx5luXQS&kOhuC>C?jU4&wx4EHn7t(Pv0 z&#FNk?!Lvfrm#Jn2bX)e_2Jl%quT3*lgYdWjkd^Q^W~QawcWka^ytYwF^Z!K4a}yr zQ56!SN}C{v5rs#_Q6*f}sy(WXU>U6H*C{nJK3uToTKH~M?7^5+j8)7y5gl(7bw3gJ zVJT{;;K{4fqGz;H)A=M=ZEtZf~H%D%1(@$;T!vTsQgVRSd8pt$pkjYyh@&Ho~GA_m|RY{O> zH37CRWZt_!2iPT*0-8DKGeUn*=5n95E%Nd?4ZFzfy7MYMmv2s~arD6T+}pAvJ3u~f zhq4$3pj{M|W6{Czf|sYwSMWJ3u&pS1!10&f>qiX-lceQoveUJfV1aF-zyiES-5X`Tu|=q?KV#uJh(VKpdZ5o z4W;l9di@D_aKR=+>KPa}&FJI&eSnyQULycPF^Zo~8{BsFi>vE!+L~e&XXVbgKP1K6 z52vju1KcWP)MO3M&3!?=u)sPQ2N-;g8mPc`rL)#^_E>eeT8q0^ag3qGTx@52n54>JSf1q-bImnZ<=Lxe%JXp^LhjXuS`u$}4>?2+x&g=Swg-C(zE ztkr@C7+MTK4KUh4lvXHO91Vy_hc5fN@<@l9raxzg#v}C~>h0Lqfhp_9W{=Xv;vITu zyu%=+z7Ef@b2C;-8)CgJbcm(l4>)kiMRU@TK`nxEyKi*@%&J+c~gx*cOR~iS+Fa0osN->T$ycXKLTFMO!A_vKi5o z9$CueN{1pEhM8CT2V*V1d8@ldutdW!qFJVWR890Vu045G6J-2w-KJriHmOdZD*%Q+;@)~Tx<{zR5PNs@>7`#SjeI@>$jI`}&}fl!Wv zy{)^mpP#L-i?6q{x3|AvfSns0ROV2Q$WK2)(5N6D59K(Op)zoH6#K&XWUc(oLuMFa zx2@Vxj@68it|t?8tQkT%9MdNLg9YJf456IF7on}AbP`LLLOCbRz76aVxTinX+6sko z9*px3itXHf8dE5Tb^mCiF8};Ifcp021|3_Q7i^f2*Hs|1>!r!p@*^y>X0J$RaH-UEp^4pK`_YlbJ+p|E3NRMdX{OeY`1hdv;(n3UMPEK+=eJcC|riTqd zO;8WR^dcA{YK`e(Lo`IB{zFacH+mRqVCAiy77rK$cpf6u!}19Z)ynv92HHCS zY!LP*#e(R(F-SC`&P5$nih;(xtr`ghzFko<(9kj>A$@8^M8K*wvk!vCz`~ZLPUXIV z%$$hI%oRq2x2VStUZ;q0=+g$#FfJi5P79dvfSpl_Z;0|ggmEJ9#;V46Wyz#U1#RT* zZx}`+b*yN``WLC$<4obaqijon->*54IR<>+r`z%eQ*==5w9%8-=!Xq?h4NVVcSNrp zdOr&$)*L`xPBy)}@X7NYEWfAlGf?1d!6`>eE;Rv))hiFrOWG zl85gYAU|tBt+dXE97Rzt#)xpwEiMf-$xvp{9Az`zrVVQ@ra zl;Efog6Kojh{W=iqUquFq~cU+R_5H@%eF3g#FV>r^Y?M57}vFLf<^Uv zm!&e$E~xcMvQlKEHHwnATi)GG}c4rr|D6RD6KJPOP(9W?^Ki%7@G>F z$q5ga6C%PdFB#Oo8RbM|RV^ofN>2WMw7Nb32q7ovkjutOUWwfrMWC8DpM8z z|DK?VGPrEqB=6m9sE|bxb4XAbt+Ys&$kHCNpO*4d{ku$=yQ0pzSU4AmBt0QNWd!)C zW;j1Jd?SBFDL+-GXPfTk>qoi5IxEXhMVTOe*(IBJO#IZ&gf;`6$0UW|xyG(;t`6=# z-u||}?vD1hPTsE0w(c%24z@0?&QAV*ZvGCw{*KB$nbrGdx3_4`nTQiqWvL9@9>ro@ z!5x0Cq;VTOdsnptRj%5C*te6zy%-3p{;my2o+(Uw#6VCrF?`=jr|^7NCW30tsD*1L zZ0;F}jZ%dODw``A#kDy(aZCi2$L!Ab&SrI%Q==wz*Nogd%cgKYMo^Kw)z5=(WldIr zJisHnqa?4_&LPTRK_>oYisG{psQr5R8^tuF=u0g4@(uOst25?`OaNsMbtnIXY-A0-PUivVTu-RltHuxGF3e= zMQemHRj&b4^=m~7RV?;T^@^6tR6#|HF;z0Ky;9?9ZL5-{9_C=o3G11{K(%^i5bk(n za5jc>k~2NX-rRLiTef8qFwyYQN(Aka@?Vnm=Z5F=gV1 zq8s)aP_K*mKjan4V?>AL_F51zdJDp2M9bbZE8K6t8+{BL+H`CMG@)sUV;S{6pkg)A zZH28U^2U9Bc|_yDgf!SapfHh8l}fy*ZefOBlLag zkx}jd+tl&5j;Jydn_!#Pp=?vN-2D-`GY5lCsD28IbiVG?IzeXzy-|CJ)co4buRRUu zpEL{8{PqxuBpv#F-|HHeI3L!)&p=_KlJsyY2{myD^CdT_-DZ@8_ zAUS-rfHwu_J{?3c_pkC_LXd;PME{UD2jBma{&7<)SYOBa(l$lB!)Ym;hIcNGca;87 zigl%U2lP)h-syO+f`M;yF!Y3VLZNl;HcQ>V#ee5BCR#_*Z1L=rR)dFPOLGD#h%M27 zC0zV0@dBt97AP=uT1Nq~;2dSN&c#08H{3NicTo|vu+~2Epp~a}ehF9-w1CzTiBMVx z4_E_QC%xL5MxWJLs->$SYL(J8vy!%V@ru>nM(XMEc$ypXCZFmX*kwMGr@5!2&_1kN z>NQkGKm-ThYYRddg+G2Qucz6LB0H0=&OMR$EXE#G1`87>q*Qjm`DhqZmZri?LcTVe++;>GPpH#+_@@p~62uaBNc_O_3~}P;?0fdf zQsU=HEAJwXTTuk8w6esH+qB8g5?_sC++?QFsz#Qt78N|ii5~}NKL&HCoxu@m+WjOIumde2Gp|dFAalbi}(4K$d zktKHDswI97p0SAtD|(&BK>P&0Y&xYubkD^M#E<6q=8u}j?W@B?{J69@^Sy<=Z35QX z3K2ga1m>Tj+uJ)c5kHx!Noni%a!yl;pNv!Aiw*_LTxi5kqgIRW|1jDprV&4<4@ShX zbFaH@_s~=j{kDy_EtNyxtDGFBQ=T37^3<^i`DbQ5pJ3!lxR2eS)z={ym zLm!h{al%Jz@b->hqqE1D2%nIsStrtSW{BW~f?lCKW_UA}(~)|<-)drJxE0jNq)s2_ z+qw7FMjOt<&p=_|VyG5%?30{+E-UKV)68~4_Y=q8&H+0SX;z%52AQ7F^uEOO`msKq zilPPueh5X>D$eoXqNYNQr&`qhh^U!^K_@glh2ydD*f5ZF+2$D4^jUgbW2M{19^l!G zl$Ao(^G=MgebM7Is0@}e(>sCxtVQaqy0esOi&zHhHAB2^m?%ON3PUUnq7|ig2#BhV z-l>Kt4WfU6-kH4TQrk`myS#9Erz{?ia`)+W)D%aX##6yQa&TX--esu_01{Qjg!_~l zYmIOWUmu2I07`}EofcMj_VpQea)I2*;$uwGGW z2gkY!sh$50)~jHU+#C!&VU(cuFQHxceK9S{I@ZjaiQ1X?(llXXQ^TV;wL{U$J$)}F zEf;6Pjd@{#!crM(Cv0Q(>}6bMd?~Yhumsi`FAv(vP&+tkRY>hrqc$@BkJ%{lUMrla zN!PEi|NWGR>_rx&jxLW+Ien9>-@MRT9hs<|Va5Yqc6FHJ4lf2ug;*ExJKfTiI8+~W zq0_N_BBSKms`f!|q_=f?Z^{#6O1~y(f;^>@jLA>U%2GPjOL;hmH2+VfZmA@>+!_o$ zq39{k5g2}=XS0bbg3*V{NW>Q*rDF=Hnhj!E^M~vvrIb#G1>U`vcNK1d2$e|mA*BP) zdncAAzhi64*1TswFQs(;X)oNcp>JVFD2J7$bfOnso}%;A@e$Kno&_I+r#=4Bxd%?^ z`1tzzxVd@T+j={@`q?@;_<^-N0p51DZvKw;er`TKehzK{%6*cd0nuHLKVV&gl+Hb{ zaoz9hBKnk=G^hEz=vDN|F&n#W)iOE-cOH5UDmaLH%fq z&autv16He+znJ~p6x)Dmp~UuIXuItAdP7B=LUBr=;k2S$4}nwFaXr;IrQ!51a6RcUR*m$c zI`+l6p33=EZp$-ug3UNIND|@?t?Ed-#X~C$F>uGX7a%bVG+25F!@-+Su z#Oe7w1dV9|P*!Rw&ylT%kLNx$c2mSVoR%ig@Lo~A2gkb#`JVp{-v5{Qp7T3+(-((z z?#jgX#7^`W-#vN68K$K?l1t03)ZSn<6F>?UC@_`bdkn8Ua1I&U?vo;DVXYJ8L0cKV z2S=?6`JQUj{u_MH9;aS6rd^CXLh9-Ac$xuczHX?0<$D^Fr)i_p&?c~ES7#M_npD!q ztM9WThcCE%fr0}{g-9hOOL?{j&Z+%;?(>eA9MuA~%kw_7FgdDKS>6YyP0REwqUxnQ zRqOfDK8Jelc(yC#JQN*7yc+U8W`NHbE0!%;$d4%Hee8m+Sg`UkWTqj-#uslZ&03t&g3fudTh4yQ90Wqfdador`kb$M(d`#1}tmqP!1yUbJf&Dg(EN z`uN0sk7)7AE%R(DzJy7&#E+-Nn4y9|J4*)QM`J_GlJ4`l-x!FWzC9x&0+Pe#FcClJ z?_J5s-!TidZrMnMh##v~(S5JiTyuhn`02IHZE`=epZ%%CPkpl!$8w579@B^)7peNh zGadmKXvB|6(Fd=ZGcJYEmhx;|+UCIa!vXkXf~ZS*R^6TZu8U*CGZ3h9q!5w5O&keQ z2)>6e3Mr&?DNoNX-Q10u!+0;Xl*Gv=U{g|$M`XEvr~%_>X!s6xw9 zNuU2tatcSB;;fnZ?p_TR<6|sS{^k>e%)yuwkv|IQbE`;ydc0Zm1RBP(R;?bBX!mpp zeJRg~gU6cB>hcU4ys#)Gd=l#4nb6|wU!PEuqtq1B77{vR|;$Y?3hYkp*&{z{OCSgrgwU{iD@a% zvz!6f@04sAgbD&97elqE^EQf(Zx|d~Kr`D3-A^2UI|tC0@{Bw)(zjR0;Xcg^L8d;Kqc#_pgbL9+ z@9x@LbibKcpoo7MP0ys^zoPUGj(-)>JO6L+UxnzMoV_b2rY&mwjI>u&NbdyIEF5SR z#5zb{%Ja}+xMAY_&Gm4MSBl#C=C;|R*^aGvlw98LgtO5c8rCaH?ci8fA+_`0!TSFa zwPUx!rsK6e2Mw919f^n9qs$=Cg&f5EKv3mmafSSmy9y!v)Op-YR&&lD9j ztaYwDXe&eQ;HXt0wNs7Se}md-F|FqK#v|{JAa!(ke9F@&C%r3Kap4~(YDd<5)!f6{ zZD!-Jt`O@2eyemTkLHrZA)`k(pQ>sfboSw@j+0`K@Zjd+(#EL>KhuWY zD_e&*nQfFLH~Nk=_xAtplAE{4=<#zN?WqN!ttC!^ z)Qbh6R62-dFALbIrPND@r<;WzRzAH7k)$QQ0I3%X*^U*g)j0R^cmv;|lzVCCXJ=$> zRWA|NT3PPJD&k1}_z7zUGI1~CKHoh(KtFO6vF66l&c`(Xa4!z_&fxhu4grp~-mbn5 zwsrvlKK|am_HKSouF9Q_)kA{YVZQF+g2_0@^(${ zH+O~J?HH(+k1wuew+)!to`HHI)7b-Q7>fbsdtYbMUJh~j|pT)cd7HV$bD<3J{6}+ zqc5+)1|NMQ8M&pI;pmv;b zV}mbrybD)=!vYx&0&s8!Cjdtr%MH9a*`Igcf7{>N}_h*=o;5hxqn?3VuKy6#`P0Tih?c5n_IP^Oc^RZ8wy5jAshl|K7l*dXH zW_rJ~dpcqWW~J(*gdY(Si!p; z8B8tZW}7H~$M)qfo?gOYzGHpLP#HiECFZ-~w$Qn7OP_e~IV>>d`zs(rphFWt!IA)< z$;=M$Rv}&$Qc!juz76d#WYEY$? zZ|Jbr-E7Ye+NTIs7}H%r11lE?D}3?>6Hu!VScP7H0<8Z_0oao+YHrdq8KF!8SnuiX zHk0y-87>Q}kYW0%|NU)dL)^|W z8K$-OFRpdC#>%F2!*mP#kOq6gj{~p~pg^arB4E{478&UA`RQ&_b%Sg+hLz9G7ocm*@s>s))E6F%N<5>r?;O`R1u zxX<=nY6Po+(_ZKHtM_r~T7D+q0j zX?toALKrnRhWRy)1~uTpD=s9Ej*oh5kx6It!o#$MTbF2HC!Z7ZWUxlyBL ztB(p{+RA9KhQ9MPT@4!mBUqGXwr>nJm$;58#J4h%M<9%AZKWZwqM7X~Lm&}iWmO}P zmdp5uGuuaNH-CI`%@sq^$gNOjd-F!Gdt@vlACgxnPki@W z)U0Q70t)&tWg(;uewi5JBe((eJ{p?Fo=RRpy{}{|BT>zPH=cX^GXq`&6ow~ZPy=Q= zUKWl&?ETzNQS(FFU>im5DxT(!%bg0-+^gm8kI0=l7<9t9q@=mGbv{04XxFS9)E+A3 zle3Oy2wKB{jPZs=RL~e3n_Q3#yq`lv~*2EeLUB_ER_L3 zLZwa;*=>@C`#+9*einQNONDaX`>|FJ$ZfjCR1yDh^4dYee?@cMar~<=*Zuzu{;LpI zGB0{)wEGXW7}A1KAy+cA^Z5hwJF0<=VHBTAUbn%czDc3ylTnmo{0DSqVO)?Pr=eR( zBy6Dkp6pvFTLy_dbE;kP(|&uB;h4eq6!8wHrED7BE1K_)<6VXM?*ARUSHaM?IT(7v zIzg>yB6Kx9#=(!rszmqq9C{#lc$-i)u^RO$ZHK1dz#dR*O5tI-NLknjseJq1#0;+ z%MLgfWyh6lWi&Y;>qY-npRzDHssqk81TUf-LFLG~4kUiyynnS+o|{G zE@JOw*Je#u`~ilf)ssSo?#n%R*JjS?5e;-08PP=@TkbZ zzM1J!#+m)PnaY3U#j0sgdPePfDTofwFcAFO9{n{3ekb+3DllNd-H+;E@5f#hm`mU{ zZNp5?TxJqk`V{j}!Q|dzo}s-xD|MhWy(g!hw97d*A~l=K>Xm7JkHdkj zlBP>EjNm)z(Y_qxOr(Dn7j2HT-7$ea{^z@Jj-E6mpJOTA7S1t{{+!ENg|;KJpr;ZS6ZYkst;i6TMC!SO>tlk9|L-Q?yWTl5%*5L73Y0Y+aec@XSpf##>Hbq#pf#z8*V3#lxXfnTH3Ffsk^ zy6)i+mOOMhcHgRHjs`uj(tUp_I+}qwvWgzhQ+vK=0|RrEb1>3*@v)rgOw5s2@?g_s z`vVzRYb%tH-?F*W;}a(vzF=aGHaCn4d4FN~a4K^oc`zd(chC6)H0DUl=TLKtA>+@{ zn4|jJ4y{-b7!rvwM`XBV!@U}h<6E}1#=YP%aMGfEf^zcY!mxm5J$rJ zhVS8v!YY-jWB5}NA$}ISB}EpWEoF9HxO^?LHLu=0iPM|f)D&xtzJdHtn*KC-qkkbt zjG?y$RNsaKS_br-a7GqCE>sL`AbqvbO4lsWb+_7RpuJnNN9m(Wi83>Q`t-W)QLW9T z|5ElCNNzxCWuaGVXc@gykikg*AX8 zM{81b-9yXv_AzY@I*Qpl0X%=L>o5xyoP_?XlDdvq(u7*BebMzyGO(VhFf^Ol%bQN@OGrw z@F&Hl<4-M?S9nmt9jjJ&)gF-&NXe&*LN=IGcrQ3wA$zpu6+tr?rK2mvq<`afy8g9j z_Ijq3Qt76Jix*DFd_rEKJn@aJuBj2yv$`f&e8URP?PSx})J_;XX55M}_!%fnBsawx z-QH#T(0!t(e5{dF4Lz{&U2DsSpAw;l)*>`CEqxSPqEzh+b##@~&}3o?(-s!h8XDEm zm0Edd4gg0O5EK=?BBjkI|K6H-YQ4OQhOvX3Y873rqLrvU3J~vzSThM3|(XWiFiO*(Eyw*kEB|nc*Y4(Zo*KTWjtEgc?Aw_x?Ka#2SA- zL@ORrRaF4t=+>VN7pY%$!2$^6t^-L|+w@+*>Q_^i^_j!d@+AWV)3&HBI}zz>C06?g z;uE;hOjF62kxc)eNhNc{x%}nQq1`x5@qjOQFRFOJSDedBC~v?Q zHR*!p0J4lqx#+N-e@mo86U9IQG)j)kDP{OxQ}9*|v69@DSc$)ieZ>00dBTB$x55&1 z$z3&*pn4{u6Fr*8t|yYd3**?Bh|9`FXaYB?fk4C1( z#k=mPY4*v6Hpbv{SYXZ%oopkOJNS->@*2vta#-hJdIi5RB?haX*0p|~g{Pi!)B}>^ zx}fR|Pj-v^hAb-E9+jFp_NK3(zoKlz+dm;M+v2ZkJY2R*vcI`IsBgZMZ`>rWC4I4@M3dD(Z4wZpAu@=$RddSaR3Z`~+YI3sV{hT-O9BRdv6zY~~2<2Tk9<0YDEHVi}KowriPy4}Od0LV=?Jxe{IrrPE0vn`%7zjLc-mCE2z< zB7W(%ec`NEoW7cK@lB!Yf*Ry$(94*B)I}G_ORlKtvR|SC!jvb)bJ1+a*``sb{!Kj! zoK~gsq@38Jzz(Hw_fWw6=Lv!U;}3$HAb$&HSasl#*;FuzQ7)UR1G|P;nm>nShh|a9 zKo-?HRz@#-w(tLXwv$ZzlE8sg6K=#vM#QK5uw>tEbqZayrYmN_^d@Uy!RLu&LkrkE zbrML%HT1H#PuaW`26=SF;V_*Ep67_CGmYNBUs{^Zq%-|?bl-!G+e6W*Y&uicpy{=p zHl#OVN@wbMx~0IP=gC&YLUlRP$G*x8tt&NLy-yWN6wpO4W<^rZTmwx2Yuk&8tvdl3EHV9&^z_dJ$9 z1^o{T1T>^=P)8O2TbTxh=fM{xeF=V6szD8)MkWR1tk3e9BXJkm^vwc`E4~_bk2w@2dB<=~g%Nq}9fF68D#&GcSegk)XSO*E;BYpn4 zX&QfSHFXi?@#t+xT3&}?is*&j?Hj zVhPHXV}cnC7SKf`b>i;nb%ZfHrq3cx;|gT}oC#yg>n}(U+;#}@Rl-v4$C{Fqm zwsyW`VogU8PM1heo`P==yqdDu4sI4fZ?P-fEb?lyU75a zPXah8W_5#64ePh3P6oq-qLFUfyowd^3#IiM4ZoT=e&x6QEyb+-UsWBy-2V!Gxj_4| zu4Uf4KL=zTR(ML#hlVRTCB(e_YQ1m#F&43Oz6{=za#yVAXXK#XE!o@gErY>EX2138 zKvQ6lg@kVLT$Y|Nt_IZOut46ctYSh$7YP?ZlPStV$>165Rp-N0_m-0sB?5}xb(%!* zaETx`50;k!>fcpdBEV|@Dz4FiZ}D9It95!i*9OSk&RmxjDl-N0KIt3R$9+ zs~Q`G95=j-u|z#d)Q?%WrqiK^L$VP-8aFs-XkS>@U%JT;&Ipa~Wjaj6ivWh2$GO;1Gn6i;)pyZX&h?B=6sp5~69 zZO0DYr0tL4+y-2g2s*;mZVxe>+f>s$V6psvoaV7vXt?^CcsS&@4GV;)>>Jf zXN7Li-Lb1p1DSZ9ny>Gy>hyNORh;MXcXal5whyqg_3`!hwRLiFv$u7#cW}0KaQAfz z@bkC#b9eSt?p*X9*ExDq-x||!o~JC8f!m{)b}w_nYn}c6!5O=6)$%+8_TSmMYmt*J z1JBda&sO*7PVs#Po@cm3I<#GG!eAzz=Y_FzV4$XHKdiMCTDE?=`P^fVZ1=oj;(4-1 zoLOA!>8$6}=*3g%wYRCGbMt9D&+AbSH`wgwKA;7@pGFKjbZJ4m^;oQfq~QB%e_6Vs zMfyz8|FEDukIYY<{Q@Q?il{tI`|IHj4wpj^I!_ZLDO?lNDx@o&r-^)9KfYaBU{@MX z(`kNt*-GtYGcc725)4R{3Eka7Ol8)q=4t+`>^POD(d@bGd(NQX!8Eug^z7OuF@1e1 z2G@p!>DyfDa?7H)RszH-D2zOftb;oH4hml??{dboMqq>ZG0&-?wvn=Na~|@%t}CJu z>Z2kW8moDis+y}&;UF88cPZS%NwB-Qvh-O-72;jud$+xk^w|HC{}Lk zHuKsP*BQ5nX5|jv7j<^?r-1p2LIPtLk0?S?&8JjlTereuLgiE3ek@;Xk*NEGYLSE` zIzF`zI-Y_lZF2S7o=>q^SJFrCLSgwEK1B|g6rSYyv;z&#|LDb|DsS&bCoXJrisLBa z5=z%&8ZN7Ok}BtesU|8+got`scVBI8RcR$^h~x zJc-N2^T+$FdvOzoe`R(Bz<+9rB*q{hkXxu!Lhbwqr&4Q>fNLiVkQ0G{+y1F}sw>Su{A^(_ z`qFuG8iw=w;OZuL3*g~1igRv#$bxKNybPf(kJx_8^ttahK^xc?`l78cZr%Wd!;?ia zvjTS4(y)2_fJ4o_TMf&DVRL=45e%Ed^PY&L$?w>jvJLOpkJ;oB@kBNEG0xr--pjH+ zux}&M4Hm3MuwsY3X_kR-GE4PD-xL&*0V*7TI3jfrZ1Rqj#`e$lqVI zymh{Rx&YslRl4{X%UYijyS6$eSR5PR_8J6{<BH%iM3u~4-^h0L^aw0A zU6T@ZC_bzn6LxDuT{tXkc_RLJ*MLpF;yiBp9AgcgDrfx6~kO@01CzBfRmB|m%ZwT5hIy*aF% i*?BioIhlT%p%7tECQOLx0<6D1=su*$>b2ljwEhot5HtP& diff --git a/EntityFramework_LoL/Sources/Entities/LolDbContext.cs b/EntityFramework_LoL/Sources/Entities/LolDbContext.cs index 52b49a5..52795fd 100644 --- a/EntityFramework_LoL/Sources/Entities/LolDbContext.cs +++ b/EntityFramework_LoL/Sources/Entities/LolDbContext.cs @@ -26,6 +26,7 @@ namespace Entities { modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().HasKey(c => new { c.Name, c.ChampionForeignKey }); modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); modelBuilder.Entity() @@ -33,6 +34,12 @@ namespace Entities .WithMany(x => x.runepages) .UsingEntity(); + modelBuilder.Entity() + .HasMany(x => x.runepages) + .WithMany(x => x.champions); + + + modelBuilder.Entity().HasData(new List() { diff --git a/EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.Designer.cs b/EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.Designer.cs similarity index 77% rename from EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.Designer.cs rename to EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.Designer.cs index 81f4297..e62e66e 100644 --- a/EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.Designer.cs +++ b/EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.Designer.cs @@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Entities.Migrations { - [DbContext(typeof(ChampionDbContext))] - [Migration("20230209133904_myFirstMigration")] + [DbContext(typeof(LolDbContext))] + [Migration("20230301162639_myFirstMigration")] partial class myFirstMigration { /// @@ -20,6 +20,21 @@ namespace Entities.Migrations #pragma warning disable 612, 618 modelBuilder.HasAnnotation("ProductVersion", "7.0.2"); + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.Property("championsName") + .HasColumnType("TEXT"); + + b.Property("runepagesId") + .HasColumnType("TEXT"); + + b.HasKey("championsName", "runepagesId"); + + b.HasIndex("runepagesId"); + + b.ToTable("ChampionEntityRunePageEntity"); + }); + modelBuilder.Entity("ChampionEntitySkillEntity", b => { b.Property("ChampionsName") @@ -76,6 +91,39 @@ namespace Entities.Migrations }); }); + modelBuilder.Entity("Entities.CharacteristicEntity", b => + { + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("ChampionForeignKey") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("INTEGER"); + + b.HasKey("Name", "ChampionForeignKey"); + + b.HasIndex("ChampionForeignKey"); + + b.ToTable("characteristics"); + + b.HasData( + new + { + Name = "Force", + ChampionForeignKey = "Dave", + Value = 50 + }, + new + { + Name = "Défense", + ChampionForeignKey = "Armure", + Value = 75 + }); + }); + modelBuilder.Entity("Entities.LargeImageEntity", b => { b.Property("Id") @@ -93,7 +141,7 @@ namespace Entities.Migrations b.HasData( new { - Id = new Guid("70d7aace-13a9-40e1-bd94-99790805f6d0"), + Id = new Guid("d3a490c6-fb49-475a-9134-47c2de9888d2"), Base64 = "aaa" }); }); @@ -154,7 +202,7 @@ namespace Entities.Migrations b.HasData( new { - Id = new Guid("a5a4f69b-5cbb-48c1-beb4-896bc9171714"), + Id = new Guid("4ea04d4f-0a64-4d28-8d74-4499dbc541f2"), Name = "Runepage_1" }); }); @@ -262,6 +310,21 @@ namespace Entities.Migrations }); }); + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.HasOne("Entities.ChampionEntity", null) + .WithMany() + .HasForeignKey("championsName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Entities.RunePageEntity", null) + .WithMany() + .HasForeignKey("runepagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("ChampionEntitySkillEntity", b => { b.HasOne("Entities.ChampionEntity", null) @@ -286,6 +349,17 @@ namespace Entities.Migrations b.Navigation("Image"); }); + modelBuilder.Entity("Entities.CharacteristicEntity", b => + { + b.HasOne("Entities.ChampionEntity", "Champion") + .WithMany("Characteristics") + .HasForeignKey("ChampionForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Champion"); + }); + modelBuilder.Entity("Entities.RuneEntity", b => { b.HasOne("Entities.LargeImageEntity", "Image") @@ -326,6 +400,11 @@ namespace Entities.Migrations b.Navigation("Image"); }); + + modelBuilder.Entity("Entities.ChampionEntity", b => + { + b.Navigation("Characteristics"); + }); #pragma warning restore 612, 618 } } diff --git a/EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.cs b/EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.cs similarity index 77% rename from EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.cs rename to EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.cs index eb3748a..e3dd73d 100644 --- a/EntityFramework_LoL/Sources/Entities/Migrations/20230209133904_myFirstMigration.cs +++ b/EntityFramework_LoL/Sources/Entities/Migrations/20230301162639_myFirstMigration.cs @@ -89,6 +89,30 @@ namespace Entities.Migrations principalColumn: "Id"); }); + migrationBuilder.CreateTable( + name: "ChampionEntityRunePageEntity", + columns: table => new + { + championsName = table.Column(type: "TEXT", nullable: false), + runepagesId = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChampionEntityRunePageEntity", x => new { x.championsName, x.runepagesId }); + table.ForeignKey( + name: "FK_ChampionEntityRunePageEntity_champions_championsName", + column: x => x.championsName, + principalTable: "champions", + principalColumn: "Name", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ChampionEntityRunePageEntity_runepages_runepagesId", + column: x => x.runepagesId, + principalTable: "runepages", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "ChampionEntitySkillEntity", columns: table => new @@ -113,6 +137,25 @@ namespace Entities.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "characteristics", + columns: table => new + { + Name = table.Column(type: "TEXT", maxLength: 256, nullable: false), + ChampionForeignKey = table.Column(type: "TEXT", nullable: false), + Value = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_characteristics", x => new { x.Name, x.ChampionForeignKey }); + table.ForeignKey( + name: "FK_characteristics_champions_ChampionForeignKey", + column: x => x.ChampionForeignKey, + principalTable: "champions", + principalColumn: "Name", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "skins", columns: table => new @@ -177,12 +220,12 @@ namespace Entities.Migrations migrationBuilder.InsertData( table: "largeimages", columns: new[] { "Id", "Base64" }, - values: new object[] { new Guid("70d7aace-13a9-40e1-bd94-99790805f6d0"), "aaa" }); + values: new object[] { new Guid("d3a490c6-fb49-475a-9134-47c2de9888d2"), "aaa" }); migrationBuilder.InsertData( table: "runepages", columns: new[] { "Id", "Name" }, - values: new object[] { new Guid("a5a4f69b-5cbb-48c1-beb4-896bc9171714"), "Runepage_1" }); + values: new object[] { new Guid("4ea04d4f-0a64-4d28-8d74-4499dbc541f2"), "Runepage_1" }); migrationBuilder.InsertData( table: "runes", @@ -202,6 +245,15 @@ namespace Entities.Migrations { "White Star", "Random damage", 3 } }); + migrationBuilder.InsertData( + table: "characteristics", + columns: new[] { "ChampionForeignKey", "Name", "Value" }, + values: new object[,] + { + { "Armure", "Défense", 75 }, + { "Dave", "Force", 50 } + }); + migrationBuilder.InsertData( table: "skins", columns: new[] { "Name", "ChampionForeignKey", "Description", "Icon", "ImageId", "Price" }, @@ -211,6 +263,11 @@ namespace Entities.Migrations { "Dave de glace", "Dave", "Enneigé", "aaa", null, 7.99f } }); + migrationBuilder.CreateIndex( + name: "IX_ChampionEntityRunePageEntity_runepagesId", + table: "ChampionEntityRunePageEntity", + column: "runepagesId"); + migrationBuilder.CreateIndex( name: "IX_ChampionEntitySkillEntity_SkillsName", table: "ChampionEntitySkillEntity", @@ -221,6 +278,11 @@ namespace Entities.Migrations table: "champions", column: "ImageId"); + migrationBuilder.CreateIndex( + name: "IX_characteristics_ChampionForeignKey", + table: "characteristics", + column: "ChampionForeignKey"); + migrationBuilder.CreateIndex( name: "IX_RunePageRuneEntity_runesName", table: "RunePageRuneEntity", @@ -245,9 +307,15 @@ namespace Entities.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "ChampionEntityRunePageEntity"); + migrationBuilder.DropTable( name: "ChampionEntitySkillEntity"); + migrationBuilder.DropTable( + name: "characteristics"); + migrationBuilder.DropTable( name: "RunePageRuneEntity"); diff --git a/EntityFramework_LoL/Sources/Entities/Migrations/ChampionDbContextModelSnapshot.cs b/EntityFramework_LoL/Sources/Entities/Migrations/LolDbContextModelSnapshot.cs similarity index 77% rename from EntityFramework_LoL/Sources/Entities/Migrations/ChampionDbContextModelSnapshot.cs rename to EntityFramework_LoL/Sources/Entities/Migrations/LolDbContextModelSnapshot.cs index aef1440..e343e94 100644 --- a/EntityFramework_LoL/Sources/Entities/Migrations/ChampionDbContextModelSnapshot.cs +++ b/EntityFramework_LoL/Sources/Entities/Migrations/LolDbContextModelSnapshot.cs @@ -9,14 +9,29 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Entities.Migrations { - [DbContext(typeof(ChampionDbContext))] - partial class ChampionDbContextModelSnapshot : ModelSnapshot + [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("championsName") + .HasColumnType("TEXT"); + + b.Property("runepagesId") + .HasColumnType("TEXT"); + + b.HasKey("championsName", "runepagesId"); + + b.HasIndex("runepagesId"); + + b.ToTable("ChampionEntityRunePageEntity"); + }); + modelBuilder.Entity("ChampionEntitySkillEntity", b => { b.Property("ChampionsName") @@ -73,6 +88,39 @@ namespace Entities.Migrations }); }); + modelBuilder.Entity("Entities.CharacteristicEntity", b => + { + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("ChampionForeignKey") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("INTEGER"); + + b.HasKey("Name", "ChampionForeignKey"); + + b.HasIndex("ChampionForeignKey"); + + b.ToTable("characteristics"); + + b.HasData( + new + { + Name = "Force", + ChampionForeignKey = "Dave", + Value = 50 + }, + new + { + Name = "Défense", + ChampionForeignKey = "Armure", + Value = 75 + }); + }); + modelBuilder.Entity("Entities.LargeImageEntity", b => { b.Property("Id") @@ -90,7 +138,7 @@ namespace Entities.Migrations b.HasData( new { - Id = new Guid("70d7aace-13a9-40e1-bd94-99790805f6d0"), + Id = new Guid("d3a490c6-fb49-475a-9134-47c2de9888d2"), Base64 = "aaa" }); }); @@ -151,7 +199,7 @@ namespace Entities.Migrations b.HasData( new { - Id = new Guid("a5a4f69b-5cbb-48c1-beb4-896bc9171714"), + Id = new Guid("4ea04d4f-0a64-4d28-8d74-4499dbc541f2"), Name = "Runepage_1" }); }); @@ -259,6 +307,21 @@ namespace Entities.Migrations }); }); + modelBuilder.Entity("ChampionEntityRunePageEntity", b => + { + b.HasOne("Entities.ChampionEntity", null) + .WithMany() + .HasForeignKey("championsName") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Entities.RunePageEntity", null) + .WithMany() + .HasForeignKey("runepagesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("ChampionEntitySkillEntity", b => { b.HasOne("Entities.ChampionEntity", null) @@ -283,6 +346,17 @@ namespace Entities.Migrations b.Navigation("Image"); }); + modelBuilder.Entity("Entities.CharacteristicEntity", b => + { + b.HasOne("Entities.ChampionEntity", "Champion") + .WithMany("Characteristics") + .HasForeignKey("ChampionForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Champion"); + }); + modelBuilder.Entity("Entities.RuneEntity", b => { b.HasOne("Entities.LargeImageEntity", "Image") @@ -323,6 +397,11 @@ namespace Entities.Migrations b.Navigation("Image"); }); + + modelBuilder.Entity("Entities.ChampionEntity", b => + { + b.Navigation("Characteristics"); + }); #pragma warning restore 612, 618 } } From 2ac48443f32d1fa36007cbf43df3d3c75c7f9dcf Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 3 Mar 2023 14:00:47 +0100 Subject: [PATCH 4/4] Adding extension class --- .vs/League-of-Legends_Project3/v17/.wsuo | Bin 18944 -> 18432 bytes .../Sources/Business/DbData.Champions.cs | 51 +++++++++++------- .../Sources/Business/DbData.RunePages.cs | 29 ++++++---- .../Sources/Business/DbData.Runes.cs | 21 ++++---- .../Sources/Business/DbData.Skins.cs | 23 ++++---- .../Sources/Business/Extensions.cs | 28 ++++++++++ .../Sources/Entities/Entities.Champions.db | Bin 110592 -> 135168 bytes 7 files changed, 103 insertions(+), 49 deletions(-) create mode 100644 EntityFramework_LoL/Sources/Business/Extensions.cs diff --git a/.vs/League-of-Legends_Project3/v17/.wsuo b/.vs/League-of-Legends_Project3/v17/.wsuo index 4fd9423cf4beeeec79397892c1e93236b5e96228..0700017afb8a240eee63be635cf66345d6dcebeb 100644 GIT binary patch delta 776 zcma)4y-vbV6z(Y%inja~P!Sa+ghYuTh2Us(FdAb_U~|xhII);u;$p%`B7<^$0(}8( zUw{M$qYkdVgJTC76wg7c^)K-zUrz7&`ObIFZT%GL$8b^Q-S_4C;obTJ#EgCZ2*Arg zh~^cJ<6e5bo`@DrPe$uPNC+Qd2tjfCakD)kda^Bs#xXd7m_)=8QwR?QFSoa##aG=I zE_=(CD3-mL@{D8_C-t{;2k}1m%|{w2hid%z?L-6+5zBwF8TnO9$kL(@t_Wi2J)QZz z3DzzM?7*`o0}VT3ix{S-1pm(UNe+GV8bp#!5|KLv!$vo_3T#Qqvi3Z-8ELe_%aVQ4 zzJywMLk22}eHJH}87_%#yQ3Cq>SG;{IS+cR)eyk|?WOdsSEz9|&g%)vCu({^vijm!xsGom-Xr??}IoRn2Mv+zf4n6n}WlWa*1$qn0iEri*Gut>iT|ozr&J cv|7wo(hKvIVp_{(3z?mQrseX+O?mI7jFAeI4Q<;j68(u{mSQh8%S0OKU498LpQsNIuG znJ#lE0TqD^nJmb!GP#6(N~R!C;4e@BWD^L0Tm@l4NNymXA5Dx6$_Kd&rcVgS76D>$ zs2FyaiNRd9iOYk917;7{F$c_8CRgxz^Md^@0W<|93zFIVg)fAWXte@7%$vlV8F|6l zg^`Sze8323fo#Vl375$(Vs?|8Bpe}%K;aFuYw{O~5Dt*j;Q}R+JrMKcfufk^iFa%g zIl;)mhtQ%i`G@-H#fPOBc^N^5z+w;N6IM`QhHU;R%g(e(<1iitia-SlAO)Zhg~bTi z1W-gXZ~m$5k76e*D zhl9%I62njd> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Select(c =>c.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => true, + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task> GetItemsByCharacteristic(string charName, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => c.Characteristics.Any(ch => ch.Name.Equals(charName))) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => c.Characteristics.Any(ch => ch.Name.Equals(charName)), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task> GetItemsByClass(ChampionClass championClass, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => c.Class.Equals(championClass)) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => c.Class.Equals(championClass), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => c.Name.Contains(substring)) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => c.Name.Contains(substring), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task> GetItemsByRunePage(RunePage? runePage, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity()))) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => c.runepages.Any(rp => rp.Equals(runePage.ToEntity())), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); + } public async Task> GetItemsBySkill(Skill? skill, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => skill!=null && c.Skills.Any(s => s.Name.Equals(skill.Name))) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => skill != null && c.Skills.Any(s => s.Name.Equals(skill.Name)), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task> GetItemsBySkill(string skill, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.champions.Where(c => skill != null && c.Skills.Any(s => s.Name.Equals(skill))) - .Select(c => c.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.champions.GetItemsWithFilterAndOrdering( + c => skill != null && c.Skills.Any(s => s.Name.Equals(skill)), + index, count, + orderingPropertyName, descending).Select(c => c.ToModel()); } public async Task GetNbItems() diff --git a/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs index b7ea7fc..3de4937 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.RunePages.cs @@ -1,5 +1,7 @@ using API_LoL_Project.Mapper; using Model; +using System.Data.SqlTypes; +using System.Linq; namespace Business { @@ -26,29 +28,34 @@ namespace Business public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runepages.Select(rp => rp.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runepages.GetItemsWithFilterAndOrdering( + rp => true, + index, count, + orderingPropertyName, descending).Select(rp => rp.ToModel()); } public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runepages.Where(rp => rp.champions.Any(c => c.Name.Equals(champion.Name))) - .Select(rp => rp.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runepages.GetItemsWithFilterAndOrdering( + rp => rp.champions.Any(c => c.Name.Equals(champion.Name)), + index, count, + orderingPropertyName, descending).Select(rp => rp.ToModel()); } public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runepages.Where(rp => rp.Name.Contains(substring)) - .Select(rp => rp.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runepages.GetItemsWithFilterAndOrdering( + rp => rp.Name.Contains(substring), + index, count, + orderingPropertyName, descending).Select(rp => rp.ToModel()); } public async Task> GetItemsByRune(Rune? rune, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runepages.Where(rp => rp.runes.Any(r => r.Name.Equals(rune.Name))) - .Select(rp => rp.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runepages.GetItemsWithFilterAndOrdering( + rp => rp.runes.Any(r => r.Name.Equals(rune.Name)), + index, count, + orderingPropertyName, descending).Select(rp => rp.ToModel()); } public async Task GetNbItems() diff --git a/EntityFramework_LoL/Sources/Business/DbData.Runes.cs b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs index bcd964f..9c97b23 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Runes.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Runes.cs @@ -27,23 +27,26 @@ namespace Business public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runes - .Select(r => r.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runes.GetItemsWithFilterAndOrdering( + r => true, + index, count, + orderingPropertyName, descending).Select(r => r.ToModel()); } public async Task> GetItemsByFamily(RuneFamily family, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runes.Where(r => r.RuneFamily.Equals(family)) - .Select(r => r.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runes.GetItemsWithFilterAndOrdering( + r => r.RuneFamily.Equals(family), + index, count, + orderingPropertyName, descending).Select(r => r.ToModel()); } public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.runes.Where(r => r.Name.Contains(substring)) - .Select(r => r.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.runes.GetItemsWithFilterAndOrdering( + r => r.Name.Contains(substring), + index, count, + orderingPropertyName, descending).Select(r => r.ToModel()); } public async Task GetNbItems() diff --git a/EntityFramework_LoL/Sources/Business/DbData.Skins.cs b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs index 4a0a965..47b7ada 100644 --- a/EntityFramework_LoL/Sources/Business/DbData.Skins.cs +++ b/EntityFramework_LoL/Sources/Business/DbData.Skins.cs @@ -1,5 +1,7 @@ using API_LoL_Project.Mapper; +using API_LoL_Project.Mapper.API_LoL_Project.Mapper; using Model; +using System.Data.SqlTypes; namespace Business { @@ -26,23 +28,26 @@ namespace Business public async Task> GetItems(int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.skins - .Select(s => s.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.skins.GetItemsWithFilterAndOrdering( + s => true, + index, count, + orderingPropertyName, descending).Select(s => s.ToModel()); } public async Task> GetItemsByChampion(Champion? champion, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.skins.Where(s => s.Champion.Name.Equals(champion.Name)) - .Select(s => s.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.skins.GetItemsWithFilterAndOrdering( + s => s.Champion.Name.Equals(champion.Name), + index, count, + orderingPropertyName, descending).Select(s => s.ToModel()); } public async Task> GetItemsByName(string substring, int index, int count, string? orderingPropertyName = null, bool descending = false) { - return parent.DbContext.skins.Where(s => s.Name.Contains(substring)) - .Select(s => s.ToModel()) - .Skip(index * count).Take(count); + return parent.DbContext.skins.GetItemsWithFilterAndOrdering( + s => s.Name.Contains(substring), + index, count, + orderingPropertyName, descending).Select(s => s.ToModel()); } public async Task GetNbItems() diff --git a/EntityFramework_LoL/Sources/Business/Extensions.cs b/EntityFramework_LoL/Sources/Business/Extensions.cs new file mode 100644 index 0000000..9f99257 --- /dev/null +++ b/EntityFramework_LoL/Sources/Business/Extensions.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Business +{ + static class Extensions + { + internal static IEnumerable 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 temp.Skip(index * count).Take(count) + } + } +} diff --git a/EntityFramework_LoL/Sources/Entities/Entities.Champions.db b/EntityFramework_LoL/Sources/Entities/Entities.Champions.db index 1c7c62bb20936b0f9beb7ac33bc42d9d9ec903f8..9ee7a58807821a4266b48aec554fdb10dec31bd8 100644 GIT binary patch delta 2758 zcmeHJU2Gdg5WYE|&%Wf&XD6}G&R;K1TN0&i{g=e13XNl5BsWcQqd?M!$~De4HEG;n zJBU!JBx;K)A)&%bT-*eu^Z~>}X_b>2@qk1{1*#A#?IZo6eSrsr_z?(DQ((`DOYBxv zk>CY!(r9;QXJ%)2X1=-UTlDlP=uDAq*5juy++{7Iu)WHRv4O(q}#5uo#54HaM2bC7wAT zC-)~ZiDXXBq_VkGGF!H+3J*x3K}j48_3V&DXX!3_g=tiNp92OR(zocJP8^t&(I1Qh zoiOklOC_^TF*XqG4-M=V`=s4si*sjUTy|~}-^hbi$;^YzR4R`y>vIfO(b`o-3%lCT zTPFMZQh{vTQ^u%1>gLgP`UxGZs!bwB*Af^aNY3!#P~$&U|LG& zQn{&t$+R3xjLIvk2k)U8L$jk)&?&ZX6(ateNz`v>RxZv#6TWqWVO2~C&4W;n9V{G` zUA?R`gHM~lr)8rf%EUa_(H(=Sw$yU`o>DxCL}NW9QI~O~XcxVxdscgvArmc(N!qh0 zpDuvOShS(sTmaj>l{(D4O*1x*)AEG%BZIk(W?yFauzodUUaqWu%&zMbyl$`0?Q?rP z9o`OK5Z!JN%t9%<9eElZ7F!9^6KqEp>h0>e`azw}&YnRA5!?Qmy~3VRL*gXsZ`Soe zspCbxM#8ZI=}u=R2C{|ac(Uv&wEv|4x* zSju|ja5Xwd*`P-Kg!&rjzpC*ioTh70Xs_PLXHvqJ6w)ysytTN z%ScQuy=eSQ|DAp-b%k>2W_8=hi{u!_tq|Ef)JO|10j5&v5&4Daa6CJfN@wHIaa@zp zk;0-@8JUGnXi(;7VG}edmu8_K>J=dmB8W;L4*{rCp36fQtW(bBVNjlFsx=5hZ7|bc zG+LhE;Z-ol0 z$SQT$<2;HG^5FP2*2jHy7_3QF6k!PXujWC;c#peyg=WcF>KSpGyaErP7EK~FKcPdm znY4r3xZMYxma#IY@w^{oC@y^JhtB{mXN@sRiuEd`z0-=1SCZX zD{@2*HiTkw{#*SAeovLT=4HM{4XS~LkfKS!sHRDQNEAP*YXK>ugtVyQ591kV=}V`2 z+ApV){@lrTeAQmAD6&6OssnUFpu$K)fy4iy6oyZVggzk+u z#q>6B<&GL-I0K&fN9uM>kyv$ijD>!v-6blTC4B!SD$=ox&KmUzXu`63OcgaYa!hq@ ziWDmBHWl%++zdBrzhpnibTbw@O}lNAHZ`vbhiqhP86{>vLZk7b7Z?zYrC#ts`8`53 rm<)uV)KD|v#p>_KKx9WlMD(XA$dW(Z^4kO+=Re)DWd`7%E`sm_z`pdL