From 30542716df04c367140cd42dd6e5d1d5a1637d49 Mon Sep 17 00:00:00 2001 From: Emre Date: Sat, 18 Mar 2023 21:39:19 +0100 Subject: [PATCH] Many to Many and the dictionaries done :monkey_face: --- .../Sources/MyFlib/DataBase.db | Bin 77824 -> 131072 bytes .../Sources/MyFlib/DataSeeder.cs | 13 ++- .../Sources/MyFlib/Entities/ChampionEntity.cs | 12 +-- .../MyFlib/Entities/CharacteristicEntity.cs | 26 ++++++ .../MyFlib/Entities/DictionaryCategoryRune.cs | 25 ++++++ .../Sources/MyFlib/Entities/RuneEntity.cs | 3 +- .../Sources/MyFlib/Entities/RunePageEntity.cs | 9 ++ .../Sources/MyFlib/Entities/SkillEntity.cs | 8 +- .../Sources/MyFlib/Entities/SkinEntity.cs | 6 +- .../MyFlib/Entities/enums/CategoryEntity.cs | 2 +- .../Sources/MyFlib/LolDbContext.cs | 77 ++++++++++++++++-- .../Sources/MyFlib/Program.cs | 8 +- .../Sources/Tests/UT_EF/SkillsTest.cs | 24 +++--- 13 files changed, 169 insertions(+), 44 deletions(-) create mode 100644 src/EntityFramework_LoL/Sources/MyFlib/Entities/CharacteristicEntity.cs create mode 100644 src/EntityFramework_LoL/Sources/MyFlib/Entities/DictionaryCategoryRune.cs diff --git a/src/EntityFramework_LoL/Sources/MyFlib/DataBase.db b/src/EntityFramework_LoL/Sources/MyFlib/DataBase.db index 9d26f5c2b331c909c7878d162ad04f9e51a1df7e..3dcabb2bae26f5c90a464576cc24af0bdd1daae8 100644 GIT binary patch literal 131072 zcmeI5du-##dB8{f2s26e-{AHJiI@KN*y%nQvyk`OU{6=Npo9?Yow(w#jcbTMeVl=R!w93={ew z&xb;xFTqCspN8#BD8&2~{Exua|1kZXL;im$wD_Eo0s%ICH^hB9{rU9W$mfFo*l&dak0>L0vO4+7 zvFUgwlVR?%ZR2{~ymrH~9rx>aPro&_ysYuFZWt7tn&ja#OR6)=uW8S$@hewgTVG!0 zD_2&ot*xp{D{K7h)k_<_6jxW5E~~50@|Uz{7kY`SrnA|ycH36d9?7FGv9vih>T1i{ zgrWi7@}TH`vdWIp*o9p6X3Mm;?Mvp~xcnQ&wz*UbjvcOt-mAw(KWk^OH(ZE*WmQ{x za)ne9+NLi%Bry*P>)NWeQqitKYxeYXNK1km^Q4Wd+Oh`rP*JZ{)T-92QlKu&Mhmnj zRd6=kf21Z}75c&6a)%O*FF7?iKYuco`9NlzJ-H3LA-exg+}S!F&&W{EC>Sc*M!_82R4+L41Gb!Fnj$2t*c9~w(gHJzT?Ux(>|Qlx|XfOd)>pk@5lr=0l;xZ)OaI**E%SgH+4dY@031X+0?8COu_%`^tWl+edesinf>bYjSW6FxpWM zi26%Ev}EX|;UeV%WiS2Yu~_CgWn70I*h7dxp+`cY=wwDwm{+@(3qdkLVO;NM=^J2h zFEjqyqHlkYH{A*TDWl$js{~3j3{=N!jjjcN6$WT9KgJ#davk)$->S<9*G$-_Z)k_K z{n)N@gV?~>*fexM-^gehb2roNeh!g6ET5FmHpUit&{y>{bjDr84Z08abo161dZafx zqyn?N*Btt?r2Jmr6_>P&;q1%{@h5+)EQqGgH`KjbjhPc1wUgv(2dy)GfcP9Ps z=`W;zJ^e%Jopd$Lr~WJTM(VSvPo(Opi>ddgLdm~Pz77fSg9MNO52!}oR6}Xd$yVt#eyu!;zpxsuQVG~(`&KkBOXbyB$dWU&a#7Y zAqDTA$6C=?h z?H%_hA{KHJYiCByG%MX_)sfCP{L5DVAgHoll&d94s7P5|kaejllyiDXsHoYjrYlNbD@dx*ZZ&U*Y3^lT zi}bWD=!Jru*Hxh`R?320s;WW>-q|n6<(!r;iCG1*cOQn=G*|%aT-4BpDit z_srU3@j>;neB!C2v01`j~NB{{S0VIF~kiff~0C~Wj z#x;{5f;8Ti2_i`2KZz4T8iz>C6{PTSL|q*zoE8xxNaKfKi6D(@!F~Rp##cb*|0Ai5 z5Oj427E&}>@{1wX`78besjlY?2=f1yJgsIhu>>-q3vO+U&CO1uQ#aaX zzhdnjqYVt~O_Sg1)a!fQaI>~BrecRxfJ*;pI5xlkD6@Xqu#K&H^A=wwP%c{SHff*H zmT&-}bt6ux2Hwi=xV{I`t-zO&0il_e$X{$8ZI$>AmwEq!=m{i1ohZ9*&R zb;H?dw~XC37y$qDj#W3iVY~&6Z}XeYX1&(DWdoKr32K?Ubz{@4@jxH)*doanY3fhr z|0CRQgt$N8zQTPTcJPA)kN^@u0!RP}AOR$R1dsp{Kmter3B293_f zoBl|;nog#^kowt_nR+bwAIW>kA5K1%eE-zHPW|50k4!y3^=*^?Ir%4(KRx;4oXMUzNI}CX{6zNnK?)jD;m5PbhEh3)3T!ernu-RUoE}X@gHKM4rlLWpBq5at2hFS5!uhGl+#p%ieUhIBw_| zdOqPxN5iC;pYWxlp;FDq{pl#o>xq2KO?Ta@TkSpmYV(%aqT%wq5`}aVswW)Tgn? zO4+GmDxCbYADlWi`45x7IeB;TyCErlkN^@u0!RP}AOR$R z1pbc_5MaRUK3Ph0wSD$Ln&KM!%s`sv()#p3n&yJ~p@B5bb@a@EG{xofsmEYw%+Nap zGQ;u|Tuu(j(~y}SlBZ#FVo08b&hcS+3O>h_(UC8W?Hu)|qF{Bzmx_iM=SxMyE$vH1 zLoek|MZqwccgLSyX9~R=U@9OP1;t5!G8!NWe=-^(69LI6ki@&mJR^CEr3_;M$taLS z{mE!7E8n*uaDU2u8Q=ep2RRZz0!RP}AOR$R1dsp{Kmter2_S)Y1%Vm1zyx|;BGc?+jL)CJ zrrAfB1Ls1RV;@ZnI||7Be>Cy4q4bwi&nGWTei3%@g9MNO5!M28(E4H%%LsrG|CHYp_N%EKa>?v|4+76XxScHjO4s+-)`+yLIz6EJ+R-z^dbm z{L}7g;4r~vo3|iQvko(Cur{`7?~o}mcja)%u>otCZ$o)7sRyfkJGN=ufSEFP&2Lz} z+uZE5$Wyw`9xQL(=%%k*kff{i9uG5K+h%(aW)ItYQJrSSjAmKuJKq(V&|Y35=q^20 zRryPXHFwS6ufjB98)h1Lt!9xax^8fnOHJvw$u2& z?{imyhj!S4b-Z1;b(lPCSzCK#^>LWkgsI0y^QH;w!aFMfIMMYw%)QplEz7Lex=iDLQOJr_MJ}p>UR3getjQ&zEXhSd5laxFOJZJ;sF*IY z6T-`<3DYXfl=79P)37%A4?(S#x`o%w-S&>VIK69}wsjL$vn3SES1V^1)<`F&3Uj`;3CeX33|OwdR=3Pn57-%+8Dtt@FNebu z7hcf_F!hE52Mu4@yKc6?yq2N$t{aZ9)wF9cbv&nbYF3l4kOQS@lR0$WZgy^(Mu*?I z_gbsz@Q=g%Hot0Khh^uXUiD6Mk*}CwufWT3EqQ_O6;U_9+Q67#^4f71itn_*M4%18 zRAI+)OfruSzcvk^VYTnQ=8De2*MhA{$ zK*~G!UL!|0`~&lZObJ_uB<{}f!K4CbZ<#Ha?>DP2TDA=n`*Wb3W#4R)I~Jgugql0e4iMgYCk}*`Z*0EX!$pre{8o6b`bDIK5W`o_{`!sNV^9O$!cA;~HTy|U5 zZ8C9BqTyJ%X~9uXx}tWo^CH+V-05(;*}87Qod~^-GCV;uw@+iEWd1+O{aA?mC+@G| z8Gv7eUHl*cB!C2v01`j~NB{{S0VIF~kN^@u0uP$NQFe~;czdHft1*W;F(W5fff@D4 zvB%j9%!t=1e2l%2==v%K4h{GDf9}-~_jfS*|9RNK4-!BENB{{S0VIF~kN^@u0!RP} zAOR%sfC$V)A~W;MRdO$nMAlQ;syA=(WpZ0jLZ?hj!0|Kks+f|xB5Kmter2_OL^fCP{L z5>l1NINqA5A%?==NSkd|ECgmC=q`o#C1RhhJ-uSZ{xKa#MckH+3$e>C#%%oVoAoM29bKl{WSvwzltMxRwp=TnnB zd}axW{qFD0^9oXGGDo}a&2u@U0PY=XRlt`=%u*2x^!7xeU`tZJ-g6LTs57| zmgV|_M)K%OEWuMNW1_CM;9-+l9vWzQP;@_8Wyfgjf`>_OwoGf=zGUu=$z-Vko~xx= zaO`kB^j{Q23w?2yDfD6DI%+Db*c1{TxP(*dBfpvFA0 zqpG&7fz4IaYZbMs^{N!8%QATa(XE2BF{p`Gg?_NN+@XZyOHNJB&!3ECK9Ct_Pj16* zi0;1=37h@#%*+h)(Ye0;)a%56;QOf0f*|mIO~_61wrpr^Zx`$YtWkSXTYcN6;%@-Z zXkY^edqZu_dz+%)*h3QDR_O~IVhzwH7f!@7Ps|+BCPXjNDDeMS!e;&}qbSU)-J=>x zXc?RE7Fu{YthK4xZFp`kD2(&ASdhq}?RVI52r5} zCFL*hBZbWe+7`j(4q&a&uy=o1_T-090265y( z(2Mt-gP_-$I>Ll*XybaFL(z$c#isA*sW`drc;$v`r9>ac{hIRHof~#wU;$P$dfm}W zF=QD1Zt1PBJ9MLA)#0LHaMpP8SS<6La!CDs{ptp(w=eX_(??>N2LdwnE1}%@bF~X& zLv;ToL3AQ>?i}-S_GtWFc6RVwN%q_8DWl#Qe+nNyGk3cQANA4h!L=Uf7y6btd`cdB z9Qtw%=oE%BdN61Ik0j!x<@TQ(94+o)PukVpiTjTlH~hYjoL;J-qX&8caWafNbH!y9C=?hN_VNpqIUqUE=Pi+r$tVEs)mF3C*=#=rug!pp`XOJ9#4;By zFweRb>y1nu6JA^Z?+F?C8TC|VB=Wos1I`6VIiHF=7fP@n3r&U+e;NO)_|L>2j;%*? z?3dV&_5VogghC*KA0&VT9t?q}`B+BCF!0u&u2-$=6zI7f+#hFp$Mb;`%_GzGow-5K zMa>Qz7JKL7nM#J)f7F|^|CH?}<;N7_7au7vKwv)l)zBN-46{E!RP^v@|KKbSWkbZd zpu&R_3`&P+Qr$7dKRb-Hd+pW(^1H!aLi$7T z%(lkt!+XAZUgBQPL8DIZu&b{_kmN&S)e4gK=IhlrNS;)Iw6=T2)g8orcqX2?UvKw} zU&%lhc~7C?xV{G6!b_)OnYZbNe)%JrcxG;n`B=fdQtK#1V@8;`qH}`3{Jx?#*H`u4un+ zY0firSotS5$9uEKU)g=D`U2?DADF+hd;kA0g}AT4`hTx;zw}^+H<&9DKmter2_OL^ zfCP{L5MN-ckb;Kmter z2_OL^fCP{L5tn1E9efw zX^M8|t#gHJv0BlqLRM1YP$-FTD9Cz2(BMGOrGi}1rQ8fDnnv(Atze2)(7jQBrs%Mn zV_vOFYEcrZVgXvFP}PK@T2h3(CMvR8sKU`uI7KUXj8-s7D;Ov9|2YaByYK&dp+Eos z8SJ=`01`j~NB{{S0VIF~kN^@u0!RP}Ac6ZNKt}5{H{rj-^ZyYJ#{VyHUnF+`+-D6@ z90?!+B!C2v01`j~NB{{S0VIF~kN^@Oz d%P{_zdv{ytu-np3D^35H(%nwC-4Ih||4a>m(x0@^LfO)VuIz5L zyQR{awp-9hVw0LN-X|247$izbHnH+xis1=^iHcG2hX_&Q3qeg39z>m)vS|7sOma@n zoO{mszI)D@%-kF|_dUH>=9;7^szjH<^YzP{TfCE0(~w6H&Qry77bP4(pW%0fE9jX0 z4M8c|WS`{D@VA-0+^p>n+i}|_`fa)^uR1@l+L+zYzn&b+fCR-_744@FuVY2+NxA__ z^jA?kPPcBEEMY~}4Y{gBdL;gA=fF_U!9+5d848WYQcoww(vfsFkv-fwvg&r}dF#lD zEI6792i4Nf9a8n`akW%ey*9DBzQ33e$+aw0fRo(Kf}b9Bu_C!O0kwchZUWYk#zWBH zIa-ccQ54}tF&i6B#`TKnjH!fW&lH>jW)+dFOhfxUTdNd2yiinM?_|VBMRIZyHfVLc zVTwq1F8;*_@YUy`cA!qhOX#prV3LdTyM?Oq~ zWMDNSM(l8#Sfn%#sLV0nWjBc*oi)L_C(`kZsd#cd0Sn}v89?OsDUeG|@6h(x_*xP>tXO6iZf_vSI{?1C&P%l+g2CnEhIPSe)CY!4FO3M z{uaNFU%^k|ZMYoWL7$^@=p{6Y!br-yn*S2=QpFEYA)sLj-@q5~DLjjxz+3guyXYEP zK_^fS4eNp1kS56Xe5#3fHF~bZ`k3Pv-TQ^3rH^O(L_vVQU?3P&q9MN=^tCCnqN;7O z>h*_o74|7DYRKQLHt&dKCNhln=|W8-$M&r^(gJEk4TPeq>}wCV%1YE5l7k^%R99ZF zUukY_4|}!pg$C{T0{=+BA8Av3fruRRD^XeTwWx9+9B7t(N-z>t)lfL#&tF>TuoUC3 z@DhFj??yM!d8}YNTGYuNLfYbM^z6g%)dJN&n#jhb zo@{KqJC+_9OGzU!<2$sLf~`j6so>Z|GA@n8rTy`VXkt8G^_~-GCuTW@Tb2i9IBnr9_$q~O;;VVr-j6Z4+5xqmB7Jjsv`7`Yh!vxcXc61ZE-o*gg)A)7 zpMb?#bd$n=;@kK)d^7L5@Ez`1un71*T{)=Pbfmvq8!VzP7#cKrj=Z^!ij diff --git a/src/EntityFramework_LoL/Sources/MyFlib/DataSeeder.cs b/src/EntityFramework_LoL/Sources/MyFlib/DataSeeder.cs index cc33473..cabeb12 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/DataSeeder.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/DataSeeder.cs @@ -15,7 +15,6 @@ namespace MyFlib var image1 = new LargeImageEntity { Id = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}"), Base64 = "empty" }; // Champions - ChampionEntity hecarim = new ChampionEntity { Name = "Hecarim", Class = ChampionClassEntity.Assassin, Bio = "", Icon = "", ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; ChampionEntity nasus = new ChampionEntity { Name = "Nasus", Class = ChampionClassEntity.Tank, Bio = "", Icon = "", ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; ChampionEntity ashe = new ChampionEntity { Name = "Ashe", Class = ChampionClassEntity.Marksman, Bio = "", Icon = "", ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; @@ -23,21 +22,19 @@ namespace MyFlib context.AddRange(hecarim, nasus, ashe); // Skins - - SkinEntity darkJhin = new SkinEntity { Name = "Dark Cosmic Jhin", ChampionForeignKey = Guid.Parse("{234F5E7F-F196-4C88-AD1C-6C392AA2E038}"), Description = "In the depths of the universe, serial killer Jhin has found a new form of power in cosmic darkness. With his galaxy mask and strange synergy with the four elements of space, he's never been deadlier.", Icon = "empty", Price = 1820, ImageId = Guid.Parse("{7cc1b02d-29a3-4493-96b7-1e3d9f3e14e2}") }; - SkinEntity kaiSaPrestige = new SkinEntity { Name = "K/DA Kai'Sa Prestige Edition", ChampionForeignKey = Guid.Parse("{15E0C4F4-4C04-4CCE-8F4D-78F37F63E63F}"), Description = "Kai'Sa, the hottest K-pop star of the moment, knows that to make a sensation, you have to be willing to do anything. With her dazzling outfit and electrifying dance moves, she'll make waves on stage and on the battlefield.", Icon = "empty", Price = 2000, ImageId = Guid.Parse("{555c9eb9-f41f-42f1-a05b-ae5d2ee7f782}") }; - SkinEntity pykeProject = new SkinEntity { Name = "PROJECT: Pyke", ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}"), Description = "Pyke, the ultimate android assassin, has recently been upgraded to carry out the most complex missions. With his new tools and enhanced programming, he can sneak into any security system and eliminate any target.", Icon = "empty", Price = 1350, ImageId = Guid.Parse("{6b47024c-0c1d-4066-bda8-2cb0d7c900fa}") }; + SkinEntity darkJhin = new SkinEntity { Name = "Dark Cosmic Jhin", ChampionForeignKey = hecarim.Id, Description = "In the depths of the universe, serial killer Jhin has found a new form of power in cosmic darkness. With his galaxy mask and strange synergy with the four elements of space, he's never been deadlier.", Icon = "empty", Price = 1820, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; + SkinEntity kaiSaPrestige = new SkinEntity { Name = "K/DA Kai'Sa Prestige Edition", ChampionForeignKey = nasus.Id, Description = "Kai'Sa, the hottest K-pop star of the moment, knows that to make a sensation, you have to be willing to do anything. With her dazzling outfit and electrifying dance moves, she'll make waves on stage and on the battlefield.", Icon = "empty", Price = 2000, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; + SkinEntity pykeProject = new SkinEntity { Name = "PROJECT: Pyke", ChampionForeignKey = ashe.Id, Description = "Pyke, the ultimate android assassin, has recently been upgraded to carry out the most complex missions. With his new tools and enhanced programming, he can sneak into any security system and eliminate any target.", Icon = "empty", Price = 1350, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; context.AddRange(darkJhin, kaiSaPrestige, pykeProject); // Skills - SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic }; - SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate }; + SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic, ChampionForeignKey = hecarim.Id }; + SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = ashe.Id }; context.AddRange(yasuoTempest, LuxFinal); // Runes - RuneEntity conqueror = new RuneEntity { Name = "Conqueror", Description = "by dealing damage to an enemy champion, you accumulate stacks that, once fully stacked, increase your damage and provide you with healing.", Family = RuneFamilyEntity.Unknown, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; RuneEntity ravenousHunter = new RuneEntity { Name = "Ravenous Hunter", Description = "killing minions, monsters, or enemy champions grants you stacks of Ravenous Hunter, which increase your damage against enemy champions and provide you with healing.", Family = RuneFamilyEntity.Domination, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/ChampionEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/ChampionEntity.cs index f93cabb..6b90745 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/ChampionEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/ChampionEntity.cs @@ -1,4 +1,5 @@ -using System; +using MyFlib.Entities; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -14,7 +15,7 @@ namespace MyFlib [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [Required] - [MaxLength(64)] + [MaxLength(64, ErrorMessage = "the champion name must not exceed 64 characters")] public string Name { get; set; } [Required] [MaxLength(255)] @@ -22,9 +23,10 @@ namespace MyFlib public string Icon { get; set; } [Required] public ChampionClassEntity Class { get; set; } - public ICollection Skills { get; set; } - public ICollection Skins { get; set; } - + public ICollection Skills { get; set; } = new List(); + public ICollection Skins { get; set; } = new List(); + public ICollection Characteristics { get; set; } + public ICollection RunePages { get; set; } = new List(); public LargeImageEntity Image { get; set; } [ForeignKey("Image")] diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/CharacteristicEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/CharacteristicEntity.cs new file mode 100644 index 0000000..cba7944 --- /dev/null +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/CharacteristicEntity.cs @@ -0,0 +1,26 @@ +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 MyFlib.Entities +{ + public class CharacteristicEntity + { + [Key] + [MaxLength(254)] + public string Name { get; set; } + + [Required] + public int Value { get; set; } + + [Required] + public Guid ChampionForeignKey { get; set; } + + [ForeignKey("ChampionForeignKey")] + public ChampionEntity Champion { get; set; } + } +} diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/DictionaryCategoryRune.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/DictionaryCategoryRune.cs new file mode 100644 index 0000000..b4b8778 --- /dev/null +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/DictionaryCategoryRune.cs @@ -0,0 +1,25 @@ +using MyFlib.Entities; +using MyFlib.Entities.enums; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MyFlib +{ + public class DictionaryCategoryRune + { + public CategoryEntity category { get; set; } + + [ForeignKey("RunePageName")] + public RunePageEntity runePage { get; set; } + public string RunePageName { get; set; } + + [ForeignKey("RuneName")] + public RuneEntity rune { get; set; } + public string RuneName { get; set; } + + } +} diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/RuneEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/RuneEntity.cs index 595b114..9b280d3 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/RuneEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/RuneEntity.cs @@ -12,7 +12,7 @@ namespace MyFlib public class RuneEntity { [Key] - [MaxLength(64)] + [MaxLength(64, ErrorMessage = "the Rune name must not exceed 64 characters")] public string Name { get; set; } [Required] @@ -20,6 +20,7 @@ namespace MyFlib public string Description { get; set; } [Required] public RuneFamilyEntity Family { get; set; } + public ICollection DictionaryCategoryRunes { get; set; } public LargeImageEntity Image { get; set; } [ForeignKey("Image")] diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/RunePageEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/RunePageEntity.cs index d23e7a0..66f3c7f 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/RunePageEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/RunePageEntity.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,5 +9,13 @@ namespace MyFlib.Entities { public class RunePageEntity { + [Key] + [MaxLength(64, ErrorMessage = "the RunePage name must not exceed 64 characters")] + public string Name { get; set; } + + public ICollection Champions { get; set; } + public ICollection DictionaryCategoryRunes { get; set; } + + } } diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkillEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkillEntity.cs index fb27e82..b6349d5 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkillEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkillEntity.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -10,7 +11,7 @@ namespace MyFlib public class SkillEntity { [Key] - [MaxLength(64)] + [MaxLength(64, ErrorMessage = "the Skill name must not exceed 64 characters")] public string Name { get; set; } [Required] @@ -20,5 +21,10 @@ namespace MyFlib [Required] public SkillTypeEntity Type { get; set; } + [Required] + [ForeignKey("ChampionForeignKey")] + public ChampionEntity Champion { get; set; } + public Guid ChampionForeignKey { get; set; } + } } diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkinEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkinEntity.cs index 4aba605..a2b8518 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkinEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/SkinEntity.cs @@ -11,15 +11,17 @@ namespace MyFlib public class SkinEntity { [Key] - [MaxLength(256)] + [MaxLength(254, ErrorMessage = "the Skin name must not exceed 254 characters")] public string Name { get; set; } [Required] - [MaxLength(500)] + [MaxLength(1000)] public string Description { get; set; } [Required] public string Icon { get; set; } [Required] public float Price { get; set; } + [Required] + [ForeignKey("ChampionForeignKey")] public ChampionEntity Champion { get; set; } public Guid ChampionForeignKey { get; set; } public LargeImageEntity Image { get; set; } diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Entities/enums/CategoryEntity.cs b/src/EntityFramework_LoL/Sources/MyFlib/Entities/enums/CategoryEntity.cs index fd59784..83863f7 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Entities/enums/CategoryEntity.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Entities/enums/CategoryEntity.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MyFlib.Entities.enums { - enum CategoryEntity + public enum CategoryEntity { Major, Minor1, diff --git a/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs b/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs index 9acfecc..845f521 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/LolDbContext.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using MyFlib.Entities; using MyFlib.Entities.enums; using System; using System.Collections.Generic; @@ -15,6 +16,9 @@ namespace MyFlib public DbSet Skills { get; set; } public DbSet Skins { get; set; } public DbSet Runes { get; set; } + public DbSet CategoryRunes { get; set; } + public DbSet RunePages { get; set; } + public LolDbContext() { } @@ -38,9 +42,9 @@ namespace MyFlib //ChampionEntity modelBuilder.Entity().HasKey(e => e.Id); - - modelBuilder.Entity().Property(e => e.Id).ValueGeneratedOnAdd(); + modelBuilder.Entity().HasMany(champion => champion.RunePages).WithMany(runePage => runePage.Champions); + ChampionEntity Akali = new ChampionEntity { Id = Guid.Parse("{4422C524-B2CB-43EF-8263-990C3CEA7CAE}"), Name = "Akali", Class = ChampionClassEntity.Assassin, Bio = "", Icon = "", ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; ChampionEntity Aatrox = new ChampionEntity { Id = Guid.Parse("{A4F84D92-C20F-4F2D-B3F9-CA00EF556E72}"), Name = "Aatrox", Class = ChampionClassEntity.Fighter, Bio = "", Icon = "", ImageId = Guid.Parse("{9f9086f5-5cc5-47b5-af9b-a935f4e9b89c}") }; ChampionEntity Ahri = new ChampionEntity { Id = Guid.Parse("{AE5FE535-F041-445E-B570-28B75BC78CB9}"), Name = "Ahri", Class = ChampionClassEntity.Mage, Bio = "", Icon = "", ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; @@ -52,9 +56,14 @@ namespace MyFlib modelBuilder.Entity().HasData(Akali, Aatrox, Ahri, Akshan, Bard, Alistar); //SkillEntity + modelBuilder.Entity() + .HasOne(m => m.Champion) + .WithMany(a => a.Skills) + .HasForeignKey("ChampionForeignKey"); + modelBuilder.Entity().HasData( - new { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic }, - new { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate } + new { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{4422C524-B2CB-43EF-8263-990C3CEA7CAE}") }, + new { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{3708dcfd-02a1-491e-b4f7-e75bf274cf23}") } ); //SkinEntity @@ -69,9 +78,63 @@ namespace MyFlib ); //RuneEntity - modelBuilder.Entity().HasData( - new RuneEntity { Name = "Hextech Flashtraption ", Description = "While Flash is on cooldown, it is replaced by Hexflash.", Family = RuneFamilyEntity.Unknown, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }, - new RuneEntity { Name = "Manaflow Band ", Description = "Hitting enemy champions with a spell grants 25 maximum mana, up to 250 mana.", Family = RuneFamilyEntity.Domination, ImageId = Guid.Parse("{9f9086f5-5cc5-47b5-af9b-a935f4e9b89c}") } + RuneEntity runeHextech = new RuneEntity { Name = "Hextech Flashtraption ", Description = "While Flash is on cooldown, it is replaced by Hexflash.", Family = RuneFamilyEntity.Unknown, ImageId = Guid.Parse("{8d121cdc-6787-4738-8edd-9e026ac16b65}") }; + RuneEntity runeManaflow = new RuneEntity { Name = "Manaflow Band ", Description = "Hitting enemy champions with a spell grants 25 maximum mana, up to 250 mana.", Family = RuneFamilyEntity.Domination, ImageId = Guid.Parse("{9f9086f5-5cc5-47b5-af9b-a935f4e9b89c}") }; + modelBuilder.Entity().HasData(runeHextech, runeManaflow); + + //RunePageEntity + RunePageEntity page1 = new RunePageEntity { Name = "Page 1" }; + RunePageEntity page2 = new RunePageEntity { Name = "Page 2" }; + + modelBuilder.Entity().HasData(page1, page2); + + //DictionaryCategoryRune + modelBuilder.Entity().HasKey(dictionary => new { dictionary.RunePageName, dictionary.RuneName }); + modelBuilder.Entity().HasData( + new DictionaryCategoryRune { category = CategoryEntity.Major, RuneName = runeHextech.Name, RunePageName = page1.Name }, + new DictionaryCategoryRune { category = CategoryEntity.Minor1, RuneName = runeManaflow.Name, RunePageName = page1.Name }, + new DictionaryCategoryRune { category = CategoryEntity.OtherMinor1, RuneName = runeManaflow.Name, RunePageName = page2.Name }, + new DictionaryCategoryRune { category = CategoryEntity.OtherMinor2, RuneName = runeHextech.Name, RunePageName = page2.Name } + ); + + //CharacteristicEntity + modelBuilder.Entity().HasKey(c => new { c.Name, c.ChampionForeignKey }); + + modelBuilder.Entity().HasData( + new CharacteristicEntity { Name = "Attack Damage", Value = 58, ChampionForeignKey = Ahri.Id }, + new CharacteristicEntity { Name = "Ability Power", Value = 92, ChampionForeignKey = Ahri.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 6, ChampionForeignKey = Ahri.Id }, + new CharacteristicEntity { Name = "Health", Value = 526, ChampionForeignKey = Ahri.Id }, + new CharacteristicEntity { Name = "Mana", Value = 418, ChampionForeignKey = Ahri.Id }, + + new CharacteristicEntity { Name = "Attack Damage", Value = 68, ChampionForeignKey = Akshan.Id }, + new CharacteristicEntity { Name = "Ability Power", Value = 0, ChampionForeignKey = Akshan.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 1, ChampionForeignKey = Akshan.Id }, + new CharacteristicEntity { Name = "Health", Value = 570, ChampionForeignKey = Akshan.Id }, + new CharacteristicEntity { Name = "Mana", Value = 350, ChampionForeignKey = Akshan.Id }, + + new CharacteristicEntity { Name = "Attack Damage", Value = 70, ChampionForeignKey = Aatrox.Id }, + new CharacteristicEntity { Name = "Ability Power", Value = 0, ChampionForeignKey = Aatrox.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 1, ChampionForeignKey = Aatrox.Id }, + new CharacteristicEntity { Name = "Health", Value = 580, ChampionForeignKey = Aatrox.Id }, + new CharacteristicEntity { Name = "Mana", Value = 0, ChampionForeignKey = Aatrox.Id }, + + new CharacteristicEntity { Name = "Attack Damage", Value = 56, ChampionForeignKey = Akali.Id }, + new CharacteristicEntity { Name = "Ability Power", Value = 0, ChampionForeignKey = Akali.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 1, ChampionForeignKey = Akali.Id }, + new CharacteristicEntity { Name = "Health", Value = 575, ChampionForeignKey = Akali.Id }, + new CharacteristicEntity { Name = "Mana", Value = 200, ChampionForeignKey = Akali.Id }, + + new CharacteristicEntity { Name = "Attack Damage", Value = 63, ChampionForeignKey = Alistar.Id }, + new CharacteristicEntity { Name = "Ability Power", Value = 0, ChampionForeignKey = Alistar.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 2, ChampionForeignKey = Alistar.Id }, + new CharacteristicEntity { Name = "Health", Value = 573, ChampionForeignKey = Alistar.Id }, + new CharacteristicEntity { Name = "Mana", Value = 278, ChampionForeignKey = Alistar.Id }, + + new CharacteristicEntity { Name = "Ability Power", Value = 30, ChampionForeignKey = Bard.Id }, + new CharacteristicEntity { Name = "Attack Speed", Value = 1, ChampionForeignKey = Bard.Id }, + new CharacteristicEntity { Name = "Health", Value = 535, ChampionForeignKey = Bard.Id }, + new CharacteristicEntity { Name = "Mana", Value = 350, ChampionForeignKey = Bard.Id } ); } diff --git a/src/EntityFramework_LoL/Sources/MyFlib/Program.cs b/src/EntityFramework_LoL/Sources/MyFlib/Program.cs index b40c873..a1a700c 100644 --- a/src/EntityFramework_LoL/Sources/MyFlib/Program.cs +++ b/src/EntityFramework_LoL/Sources/MyFlib/Program.cs @@ -5,7 +5,7 @@ using static System.Console; using (var context = new LolDbContext()) { - WriteLine("\nChampions :\n"); + WriteLine("Champions :\n"); foreach (var c in context.Champions) { @@ -18,10 +18,6 @@ using (var context = new LolDbContext()) foreach (var c in context.Champions) { WriteLine($"{c.Name} - {c.Class}"); - /* foreach (var s in c.Skills) - { - WriteLine($"\t\t{s.Name} - {s.Description}"); - }*/ } WriteLine("\nSkills :\n"); @@ -38,7 +34,5 @@ using (var context = new LolDbContext()) WriteLine($"{c.Name} - {c.Description} - Price: {c.Price} - ChampionId: {c.ChampionForeignKey}"); } - WriteLine("\nRunes :\n"); - context.SaveChangesAsync(); // or context.SaveChangesAsync } \ No newline at end of file diff --git a/src/EntityFramework_LoL/Sources/Tests/UT_EF/SkillsTest.cs b/src/EntityFramework_LoL/Sources/Tests/UT_EF/SkillsTest.cs index 1fa7c88..1c5a5f2 100644 --- a/src/EntityFramework_LoL/Sources/Tests/UT_EF/SkillsTest.cs +++ b/src/EntityFramework_LoL/Sources/Tests/UT_EF/SkillsTest.cs @@ -19,10 +19,10 @@ namespace UT_EF using (var context = new LolDbContext(options)) { - SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic }; - SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate }; - SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic }; - SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate }; + SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{234F5E7F-F196-4C88-AD1C-6C392AA2E038}") }; + SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{15E0C4F4-4C04-4CCE-8F4D-78F37F63E63F}") }; + SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; + SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; context.Skills.AddRange(fireBall, whiteStar, yasuoTempest, LuxFinal); context.SaveChanges(); @@ -44,10 +44,10 @@ namespace UT_EF using (var context = new LolDbContext(options)) { - SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Unknown }; - SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate }; - SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic }; - SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate }; + SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{234F5E7F-F196-4C88-AD1C-6C392AA2E038}") }; + SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{15E0C4F4-4C04-4CCE-8F4D-78F37F63E63F}") }; + SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; + SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; context.Skills.AddRange(fireBall, whiteStar, yasuoTempest, LuxFinal); context.SaveChanges(); @@ -87,10 +87,10 @@ namespace UT_EF using (var context = new LolDbContext(options)) { - SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic }; - SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate }; - SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic }; - SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate }; + SkillEntity fireBall = new SkillEntity { Name = "Boule de feu", Description = "Fire!", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{234F5E7F-F196-4C88-AD1C-6C392AA2E038}") }; + SkillEntity whiteStar = new SkillEntity { Name = "White Star", Description = "Random damage", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{15E0C4F4-4C04-4CCE-8F4D-78F37F63E63F}") }; + SkillEntity yasuoTempest = new SkillEntity { Name = "Yasuo's Steel Tempest", Description = " une attaque de mêlée qui peut être chargée pour infliger des dégâts supplémentaires et projeter les ennemis dans les airs.", Type = SkillTypeEntity.Basic, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; + SkillEntity LuxFinal = new SkillEntity { Name = "Lux's Final Spark", Description = "une attaque à distance qui inflige des dégâts massifs dans une direction.", Type = SkillTypeEntity.Ultimate, ChampionForeignKey = Guid.Parse("{F32FA768-A1DC-4F6A-9366-FFEC6B0D4159}") }; context.Skills.AddRange(fireBall, whiteStar, yasuoTempest, LuxFinal); context.SaveChanges();