From 0b2d727965f2fa0085ab820ccf5d7c18c79294bc Mon Sep 17 00:00:00 2001 From: Salih Date: Fri, 25 Nov 2022 18:26:22 +0300 Subject: [PATCH] Add Json-Column Article --- .../2022-11-25-JSON-columns/Database.png | Bin 0 -> 10172 bytes .../2022-11-25-JSON-columns/post.md | 98 ++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png create mode 100644 docs/en/Community-Articles/2022-11-25-JSON-columns/post.md diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png b/docs/en/Community-Articles/2022-11-25-JSON-columns/Database.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a5516aa6ed8bc9070ffa772a3645abe0b837a5 GIT binary patch literal 10172 zcmd^lcT`hL*Ea|%S4310lu$$g1u3FHKuWA2(gYQisv?~b>46YpxqyXo73n3?K?I~F zln_u9gb*S{0t5&UAyQIk2_%qw=zX8}-sis0yS}x)f4{7ilbJL7%{dnC^PJT=0fDMS z(T%&?x9Yz=xO_WEKtM|Q=U33&PKhZXaLm^H;<@Wk7g}~x!c6_Qig}N$GxNLDvix>R z80ay9G9`DYITr5$Uacjq!wL+qrYAXK*J~Mf&&-ybZ`-qbr<>tPl|Gy21)tiEGz71` z#o9#3Ph3h>l9!Se-+#00dKiO8^a*Y{GO=k|jpeah`0*8%d=9Y%%9a01{anBSK?ZQYAY(q62Jo)_ z`}h@(!Wi;pVNB&sVa&e2Om4K&*aPJ+Bl%7mrI?!M5812F9|HesK94TFA;@50x&BoV zf($JMdQ4N(b2=kd+!gz5UGuG$g5@T=tr$XIBNfAfHtw#yDt62*6lAP{_V~P7%AGzk z5&tjGD*pZzJlD8woQ;fue6EAErD}hT1V*mCa&3BFp+2FpuKV;MJL;eEJGPD6lVfby zGn`nhk9DGRyM)GBWT#2YYr^b2b1@s?$Q$dJoS&Mf?iYmo&DZ|d%7n)4TI<5plcfjt zKykztIOpVOEFoufOkBal9cjGI@?N_mG_8o=j8%nh;&7D7~!*CfAUVZg|Z3}-$k04lw3Y{IG)@OP(wix@Ql*6;pd&dyL6(-bnGydA?|N^OZd2ku0Gcxx2s z=Hj9)ra}~oV11zJm(VJjxog9Po!iD;L0BZ2w`Bl^@OYXeCv?|XLOXq3BiOAYjk?J+xPl(G*V;Dz_lZ$dF)zkYy_G)8>t`zOQ6p}{o9s2= z1>l(NX!9`shwtK$$2KDjF-C-3h`Au7Gi);J8w0`TPX4?E%i@Y~xJ=!hm@%qF9wEcB z!^BFG$=eu5;hne(LLF`nuGYauE!wdSJp~yK z5B2w)c@x^g51<=Uh2WtgpGR#mxcfjEk-DWE= z=$u{T6Btj{oZq- z7|d<=R?_xolsgb9W&&vE{w2$GnGe$rCbNwyY0j!PNgn0p|9F4pyP%cH*T-*v6NOp` z(wGpd@bH@7ABN?sPk_Ha?qb9wPQr+kW9Ra86yF%Z#Ys^)7op3Ip<_FUu$E&p&3tR^SGdN-+nI6T(b7A^8mDe|TF2+VZmCA#nfo^&a%5lKHB*o4@2gLgt^# zgY=JiGxpBo#SBObVB7`~8Ho4~DqU>lMqK*05J-~zuXX3Zf9Q3P_!q{vN-T+gli7Pd z_Uh@0O$3M!`dbL!d;W*YfEbi~1SJQ->kct9vdWvc=z@U21HU1PK&x(>Oo;yvzMe2f z>(lTKc?q#!Z3)6KS%G?wTlqa=o8*{>>}Y*bt6QGn&$iZ=cM^pJh`W6U8gluhy-e(0 zPXN?X=htKU`xgQPCNl2Ep8>8Q0Nci;r~HHxpZ#Po0s>}_jrRyRoqlIajp0Eqv~tg9 zfhV+ke>F{9e%~SZ&^JbRZuBc3+;fN-6(vij%f}Q;Bb+9uXFn9cWOFtb_mAjdcH4-D z-2mh$;Ok{>T%Qeq*4Kc;BA_RE%~vm=S6oF)N2>^Vp$5irG?>G1>kU?i zo1;O`FYVuamtpG{f1eJAM!tvTqY}01_(Jve5x%cwi=P%|YH{)9dqq!#h|YUV#sU)> ze$Z{H(GSC(Xe2d)FX(hC;QA5|FcRnaz87yhOXTim5w0KA@?hA_A-Q&vM zXh!K4Arj93g)soXL)~CN-ovoaB$TZ7#Mshw;Rvks^JO*ka7=3Pq9WM48&@+s0#(1Cof}M+VdU7nZ;8W#&BKTNrJs zjkHmiEA>$)(O{9JjnaB^$LE(iEjOla)?1Dn5SE!<1Y_e&jN;f6*W(M7i1o;+O8DoN zD9@#LaS13AV4>`_#)_Hu%?%L87Dfq1!A+tapPuKH&?~ew)+?1ATpK0p0%5@Yvk^FU z87&c>&JF1{qyjqDoVKXx*5{%VNxs9DTsGi$<+0AStDOaM>>Z(r$Fl%ISM)mEA+^KA z6C__aQ6$0r9hrX#e3em1HPZAroGkhvJfcd=xz!N!$033vupKLVi zQxnc75SZ7M=1XTrGBfdYRwaD%r6)ew1Rr_0PHK&^W`8_9M|RtIPJrV3q%TNVc&Lz3 z_DaNv-o>O*n}RhJq~?{VTy5`SNfy9^m(`{~>U=HiF$OFcD-FCG0M?62lcAAh3w!(g z7`3<7D0`Beb3eqhMxwjX^eHq}&!k`#lj(Zv21YDhXgZfMj21}<~u z=95k#CTOZh7`SY}bxkp$AuhHtko_DN?1ntHwTOQfZ}i$od=0cT1_S!cO^gNN%y{)R z#|u#n=GjI=-@!Uc;m@DVJn-&|l*ynS@GG^OeNnqRw>bvWQoDIT^a2zs&kNJ;%}?YwqegB|{y7rO@<_d7E{e>IbUOu(+0Q>GmgHD<>66j2vD8 z0~4c-r7@?Phf-hYeoO8-ZP<=qTh&6O5c3+8dwkP%Aj%VRkNXsh@|=s+pNHs}=ier& zg&c^wG2CA40EarZU#d)<)lip zXJ4-e39!oj5WVkx_)2x>-sfg^99iEt@p$E)YsOGtT;jFihU970nZd_ZIWzHdm%mR* zUduMDG&h&AGDv0}hx)*5p<%~H-6K+ zh3eMIYqVK3F1NS%6##m0b+mxFX<a7=X< z&!nu#A!qKpA6reRUkW8#ScI!5A3oGt_~SD+WjkiGUj9kdqS5}D6#YTnWiY(8sWC;# z`#{jO8q|%Mz{%Kpb*lyg0Oi!!5Vccr0^GZ2W_vBT#B!-u6F3C>&`TG)`6cyxX>Is7 zCEbaoVwVU^X@ zyJ-eEx*q8Qaz>TZGT_Jj&eP&ts6o6MIsAQorfP-dDqz^}n4cnyq1L)%-ljSBjb6v2 zuc)h=skNZwj}I0o#TR8=$(WJJueN!UVsq|KaKPF-!8Y~sexgn@v71hKwj zmUiPKR;d8Jp0xQ`(y3I~i33Z4`=RP}0)`VN&}K;nCLmhPR3l|Garz$2n;g~vS!fu2 zCLmpaHjQ3AEYo#rJxekX*O0tB>|5j(8_@fG^$zMNGOV#-*qNlZDjoGDp=mm1WwOzr zX)6M^m}PIV0tt^d#v_kBj>V=Iu!NSR0nm7J`Z0UVar}$l(Rib)#_=fs26Mxu7ARP# z=9%N`A1WEy-R_P>4e~EXrun2Iqc}-xmm0ofO)4u~zTDY%_!&e%(*_d%iXvIHpdUstNVI9dET`Gb z*t_F@5YS*j$O|928{PPs5&Lq`@{@Xdoi5$)MD!>3V0OuJV9!JLi3g}h9T$auD)R8? z2YKp&Lqe9`6F(we3T+BhiuqpeX_!&@Pef}uA`Wsjwep&asxW5q%$@iy#R;*~|AVS! z-Ta8KoAj6(+Y-9+zY5_bu-bktK`_I;%$WIyx@xfxf!+U)^sQeE%HLQf09CoZwnV1Z z-?AJcG-a>+T~M;j;0%AcA4I=6XDE*7By8PgpU?$;;i!s1oEv>YV@;e184h@zppC_{?#TcTqeoqoR z|4BQev5cT4AO;~5wKlfNJdre5)Y8sjQVU`6l}HGa&Zpk}ZUdg;MOm|r z5XdW#o!vBUnYps!HR7?NRELwIcKnfiNZckM&zalmvfpokd5V>JsF-)_eA3L67yQ6U zZ_^ea)xR~Nr34w**WmkQNn@$ge>3v1p=&zc?I3wzcmY5&4pwjpGIn&5#=cwPU{}(( z8~Nd(v+GN`@VlyW`OR*Iqd|X!$Hd7fXB(p->R3nxF&%#~vnXP|4cQcpSYYE@I%B=&^x$olJjIzDtKx*iNWpHrlZm5=Hq}H># z+q=$FIg`N9S9~I~Es?&Kh~Tsx+~Cn|+(!x>fNL_qQ8fz)FZCSR1p@JM3rV`V9Bly7 z?3pYIk)t6?P{;C<{Tq8pv8HT@OAHKJ1uUUXPAhjeuPC;HP2-S}F5JUszNt=hsl!cj z2v0}`<1;&b2~a=IrPC>Hpj&F#r!RgJ_gA!f54+O81ddb72Ds7{3n@>Y-f_Dh`bY); zxtHT}(J)LSil+kL@Qm-hvbqsb%JNM@h)Nzu9{nL^R7*I7UO_5`UaiRvkVwlZvF*d_d}JwGZn_~&{i@h9$hl&9f`VUsD(cQx;&A2CKI0D97}JTVQJn8 za9*qKn&(#QYBeMCegEaZN^`LZBbdbDwlQ9nsfH3?Q*Fh zgrw=L0O_^^SqhVr_3Ap8J6X!&J9H6oU~y_PmR9tF<{f7igvWO7PfRafBvPlA&UhDT zgBRYfUJNHu@OPHlk*^Nn5|VT(ec|p`3C`RgH=|GRgPRMS2dL%A-a11qPr7e8?O1hx zzT>=-V3^}12m*)x*T7r(rE}izTbEvLW z^eu&0?du);N4L%2OQ24@7lbrH%^&?p;jI<(PpvP6VW#IT?$5hgH?%f7@c5*aUtI&$!^{;!TzfkHY z@U-jIpRC(-JkEbkuJf0dNT{`HTz#J=F+LbBTe)g=JN1hyJil%?9#a=2QVtKP=de(S4NjIy@3O*kD{%6utLG@(2(<5~^ed2fl3H_!?7?YoRk?M=wO zI#Z4&9yazgr|x;`lStWg-2JTE%&nz1r_>4}$v$`*38R$jg+{QxFWgA@9RH!=-Ru^P zCRSwylB+)g#SA-832ahVWX=fvRAr6X%OVfAHr7a8Uq{sV3;5jr12l(IDYO8$c-4h> zb)})>H4#oy(>?6=+1C$R7C2w}WiR-W97@YR7wKDe$k+QzefF{01%W!oKk{$#B8#lk@u?d`%#kYHODR2Ca=4=lDPRap)u+%tmE%tZS!*9GuE>SDfU%WMS=ygFp zmdDm``zvmf@T&zS1t29PH>jOF8LqOXs8F1ry)0qB&iv!*tm})au$AS5!e9K?l1)UY zW#7u*q$$|RB}eE|Dl^-Wz6t2@wXX>ZV)@3;t5XKj3-NH5l}GF58O3G#dD+QTDJi+P z=C6DI9xA#@0T6t-MX2@}_SJY-$*93vV3qkbh_aPks?AY$Y@lE8hg9x*-%IQPFSr+d zRqx>IZ@Ej+?f&kh=bX@~y)-#ocl)DY`oj{IeqBTMN-h#z?&;GHn1a7)2o>>t-IbHo z+@&42o>%>8CAm)byY3aX#)-)OT2NNy&|U5I^0BF$i(8W>o^AEAXxgpRIeBHu2vTRE zM%th1T4mts_PlzqHUwAyt`K)?;VACb&Et;m1H2v0918=;p4Vhe&+G)YHKtJ-Cd3%G zK#hzD@+L<-^T{}hH+}y_p^tVdq+s@Axp|G)n0^)HR65J*!<^K(GzzreI4$#RmTNDn zd80(l(^Ds?tDtH%Y*Xg(*K3U%GwP%7d_RS*BVYJwkWLUk@_lTm%@9h|KC%nb&Ar8h ziM_IGh4*aJ$v5`isFHVq_Vs1gtU^17%J8@iqcLN95ZVKMF$HxiDX>LdwW;H` zg{;d9{iEVK-jY%8CjcG3T$Oh>i#BGAuT!M?L0?XkAH4*FfqMrW&65TSRXtCy1%h0Q zFlp5N+-FbLz{Gm_Z$=|uc^FI{HoJkw>LEN0s_JW?+=2TW^ZBf#)c_w zmEJk2nUdU;>_~}t$MvCJa+23V?=S`mIa*gXMTyJ_Bi&FvR&_h6{YXL6eMj9@3w74Z zz}@8|HBuBT0j1wq2W>M<<-hBMAS5d^zBYbH)l6C4*}FEQO1|8W$CXG<{9KmSpA7Vmh51)yo;(3%dGUT>8<-y0`j$ z;HU%Vs>~jr#d0o)u*CZ57iaWZ+*0G%sF)~ETcUWeo_s4Nm_cKVcdOk zw4Bv+b`Vln*{5B)r_opcO?F+Chq^=U;B24B>NC_-=1U^W%05&q+jVz#NCAnr+p4)v zXEB_;?02mKgB*OMRnA&;7ow#063S7c%a`5IDDWkC>UR~AZ%2jd(c8rZK^^Doip$0l zbqK}g<9^L)CE4uxYjpl+*21+O9agnx`?MQAX`p5RxZ^`lpVZy>n{|$EiGwrIFu;u_ z+0JmQCQ0w2s0uHi)S(z<@R+`4VW6w!CJXKF*D${0SaafaH?RBCIX9A2?!jc+2asDRpn%G$ZA|5c>ifs$D*&A1DbX;SwR* zSU|`blGJ!sksgdcvT;DyxsvIep^_Ks^3CQHEWzCZp4EtA&6Ifj#H3!uAxQs@#;MBj zRW*wle|IC{sZe+DYfgX(Q8i4v108f;+qGZMyH6ylr29ss8#IJ`oRO>6a$jWra__i9 zgP>J&vW~fPb3~}1D^@05ELuy+)n~yTRbIl_+WW((;U}d}WE;vi8YeimC1I<*I7eow zUCnP$2?IS^b)K<-qtH{7a}oB}6FMJjV5=lo)z~04koUsvyEVlIAZ4za-mz(QubX!r zv(Wa|38$Rv%5Q*FJKSwsaGo7r8>05O$O7352QoHguEr&%fdkTl-ciilZQrp9ve;q_ zhdbN@WTvJxCj3J{Z1QK##hS>YR=B}};h2c5IB;Lw%Wml#zdZIfFto@HRZ|uaPHmo05}OCQ$%qepJ<7PoUbro&bwihoE<_Wasq zWZ7kNbx5MBPL{YMwL-n^FbY0-2K5zqwA@$XJRq#b6D%{#kg#jYpx_8WH<~2j6>4Vs zE<=NON|SG*TSH=?5=;{8eB)+kk$zn89{(L7WMrB|%j9N1ljNGYok~O;j1u`kV~R1z z8wM6lPAHyoxY<#S=W^mT9TI^UZcd&|sg;@w5d-@lh0fJCV_qG*(k z2Yy}Yp!SeqSHV{^ui1B-tQnvr501h@9^T*;;etW?&TC1|o6jmu4fBJr6{E-xtf`Hs zl{k)}(;huDa0vX+umtC#THyAvrAWsonfGBE24QcJMW?hHDH?H!!*|=3(>hW~O<3X8 z(Yn_Zj|xMzqYC8ps*ZInAGW`2xAl`6#cHcGwwp|o-kO_XPrI(WjP%k*2t`}Qut7n_ zO_+>9ZEa2pcAajF`VH(|e)MD3gXx~lsi^oc)}uzy)Tzjp_K>Eam+S7oMnI9V)aeF(7x%`xC79DG zD-HJ~Bn#!rUeI=i89Cw>*J1M)VRE8aZgTW`0`gOEZ&XO>z}m0XLi5!QW?EefbZM5>{_`4uQ!c;BuD39`nU-t2LT z)i68mE{mh-uhK3oa{!NIKY|?KUt-qD?0F#AZYNWPN6yN5P$D&ZT~agGRt|u z@um3&Pz2Fk*tK+Pn_g>xHva93%=1NKegwjfo!0aHW=L%j(rwTE;^OAP+m>VfP@SM| zC!3CUp~l@CUuBN2%_PHXx?_!7R*3t&t-o*H>%yP8)UU9)T2~7pb5CJM38@K-w-0j@ z)_=s_>zkv#Y^O)bbh7t*`c~%Fi^~)Q?Y!UV0^O5yJ9&Aa;POmvX4$iAW5(@qiEDti zd;CyjsV>V;%d;1&bSSC8xChv|dS9-e>v3M!)OWd|_E@>a&+zT%G_;!Q9#rS-ZBTA( z-t4^R+t6&ec3yTPihc?k&FMF)fQ$x_0~PSK9al>%{C#iV4CnjTsO~w++Bdq(f^Op( z4S~8|M)6KpdFO72YAmd|G0Q0$RQfHpm{FWY-LfTR(VoN9xHHV3W|0wwE=A~_2HCU*Zjyxm@oZV2i_F{E-MRJOJ3j{jU-a~)=ERE{j)_~>lc zJwqEEc}Sr+d0V@f?6&sls+W(C^fd^bKPxCuk!}@`mb4Wdqq*09rk%puxFNlX66_No z%y!|*L^;^#SK_j15D|f+&!xtF4$bj08o#1|-5v+f7mmZ_Q=&9Ln;Y@L^rw5T3Ow}n zu#lZmpI@_``#;~Jqj~o1S Og83!uixubZJpMl&1{MDR literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md new file mode 100644 index 0000000000..f8dd2c4dec --- /dev/null +++ b/docs/en/Community-Articles/2022-11-25-JSON-columns/post.md @@ -0,0 +1,98 @@ +# The new EF Core JSON Columns + +## JSON Columns + +Most relational databases support columns that contain JSON documents. The JSON in these columns can be drilled into with queries. This allows, for example, filtering and sorting by the elements of the documents, as well as projection of elements out of the documents into results. JSON columns allow relational databases to take on some of the characteristics of document databases, creating a useful hybrid between the two. + +EF7 contains provider-agnostic support for JSON columns, with an implementation for SQL Server. This support allows mapping of aggregates built from .NET types to JSON documents. Normal LINQ queries can be used on the aggregates, and these will be translated to the appropriate query constructs needed to drill into the JSON. EF7 also supports updating and saving changes to the JSON documents. + +### Mapping JSON Columns AbpDbContext + +```csharp +public class ContactDetails +{ + public Address Address { get; set; } + public string? Phone { get; set; } +} + +public class Address +{ + public Address(string street, string city, string postcode, string country) + { + Street = street; + City = city; + Postcode = postcode; + Country = country; + } + + public string Street { get; set; } + public string City { get; set; } + public string Postcode { get; set; } + public string Country { get; set; } +} + +public class Person : AggregateRoot +{ + public string Name { get; set; } = null!; + public ContactDetails ContactDetails { get; set; } = null!; +} + +public class MyDbContext : AbpDbContext +{ + public DbSet Persons { get; set; } + + public MyDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.Entity(b => + { + b.ToTable(abpEf7JsonColumnConsts.DbTablePrefix + "Persons", abpEf7JsonColumnConsts.DbSchema); + b.ConfigureByConvention(); + b.OwnsOne(x=>x.ContactDetails, c => + { + c.ToJson(); + c.OwnsOne(cd => cd.Address); + }); + }); + } +} +``` + +### Querying JSON Columns + +```csharp +var persons = await (await GetDbSetAsync()).ToListAsync(); + +var contacts = await (await GetDbSetAsync()).Select(person => new +{ + person, + person.ContactDetails.Phone, + Addresses = person.ContactDetails.Address +}).ToListAsync(); + +var addresses = await (await GetDbSetAsync()).Select(person => new +{ + person, + Addresses = person.ContactDetails.Address +}).ToListAsync(); +``` + +### Updating JSON Columns + +```csharp +var person = await (await GetDbSetAsync()).FirstAsync(); + +person.ContactDetails.Phone = "123456789"; +person.ContactDetails.Address = new Address("Street", "City", "Postcode", "Country"); +await UpdateAsync(person, true); +``` + +### Database View + +![image](./Database.png)