From a357ee4975c0028e622cc8372b27857f566949ff Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 18 Dec 2019 21:18:24 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20BaseEntity=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=95=B0=E6=8D=AE=E6=97=B6=E8=87=AA=E5=8A=A8=20Attach?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseEntity 纯净版源码(.Net 4.0).zip | Bin 2340 -> 2698 bytes .../BaseEntity 纯净版源码.zip | Bin 4088 -> 4439 bytes .../BaseEntityReadOnly.cs | 40 ++- FreeSql.DbContext/FreeSql.DbContext.xml | 7 - FreeSql/FreeSql.xml | 290 ++++++++---------- FreeSql/Interface/Curd/ISelect/ISelect0.cs | 2 +- 6 files changed, 172 insertions(+), 167 deletions(-) diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码(.Net 4.0).zip b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码(.Net 4.0).zip index 15569d335e8997e97db1eaafcf78e9924c4056ce..11ac08713d39e5fa8d6f14da479b098d1c22ad90 100644 GIT binary patch delta 1517 zcmVcG2#1pokR5|a@G9Di3ykJB&|z9aD;Ot>UslmR3p zptLXy0~!edVv0BbLT>6(Lza&100oW2z9SCo`ywGKgcy(z`|@WdopRzY@EoT}mvqRm zNchk?_Iux3{rvpn(>I?}cOTlw2$`6)%?()K5!dwu7SwZjZs7v8KT+p`I6a@{sAt>6 z3MuEmZSKMaM;9(YFouVR(HibM4rcX2vJ_l8-Msh$jRJ@uMe2~@9kp_MI?gu`n+Q@y zvv*DfFCWZ&xf(qDIQ#lj2jp-!=B^?x*+kz!xqtkhsJqsLV7?`MMo=EXlo)#yWz8?y z)Izw#1;ds=mW??_>oF%|uAri>sHFDM;1Drj7>_JNdp+iCWAtE7kqj_0HuQ8OczrD4 z24)mYe`vjatmp}Ew4tHLk`Iw30dz`yG)pFEL>pj;AF%XUYApK>C$L( z)N@^xkgyFIq096u)@#HBAS%cZ(zG%xA@2FiB6&f$Fw3Q!gAb#c=h=wUBP72<(zib6#JJi9gu3cYKRDa(E zw7O##9jX%0CEA0nkUc6gnbN!Y@M&xMN%Q)v=H-_eSW5ZJ2b`h_V2BY8dhQ-57SjX$~)vQrbUv|lQ1!+dZq(hAan0&L48*SBpW zQX!U|IKk%NfRGk*G!7yXALLR%c?_A!#gufSkGZ}>n7sTV=w5grpHt%mmv5vDP}Q}W zLL?6t1Ow?IH8cZ=x}Z&>b-(8Q>PWr}3bn~2r6L&_<;am(Q^7V*%;_I(Yky?r1#&rs z{z}MCy@qY^KYXdkB@F)hiSb=o0obirZ97axvR;B-Pt8 zLxxbQ&-)$T!}Sl{Zh3B*$~I9eNLi?P^X=@lht2EfBH#ZfAsesgGBzkycL@DX5CJAZ zkQABUKQo`M1}7SsAAgn16Cjj8FD}pWc2e^=6&~xTOUW8KDm%U$;_#FCM1Q}1D!A}S zz1tyMf_shT-8an}uT%>QQIv~Uo~y;+$}M=g!8`x^$wqMQOa}eKki-pjRC(s^*F=?a zGqI|#&q_uQrD|Yh-A(aRSnm3}KGoTTNU~r?)Id6ioOS_~ybKbx|B?z}Q(q}lKLL|S z2x|@zs*+D=>cG2#1pokR5|hCQH7@IE8eXNf)dA~i8eXNf)d2t(PO=@I)d5gT1qJ{B T000620szJU006ED00000kGI-= delta 1135 zcmV-#1d#iR6{Hfd0|X96tB+3>*H3mF1ONbU43iNA9Di0>tJ6Rfe!tNFaL7}NB~?LC zYvZmI1jSZ-P?2de+JS7HnW$9+cdmNH2lssev4~g&QS`d}nVa1D^_WL7V-vhH7Jo4SH5sSK;9yvYG1!C{-s*6|JF%9G zK3PoQD-3E$W^mA@_AW|}RAQAWNe&Y|-wocJO09)41icUaH&0@{X$hsFE(u_#a8cEV zalrcZz+2Qk3JyLBTaOvoll`D>P!>LaUA*26E?(*P-UqV}g6Efmxtk-YYBh&&f-G_z zMSm93J~?EQPb?EtwOE+Z_AtEB=k6G&s)RHVZgw398`6Uii;hrbt2H_v)`TO%aS0T~ z6kEVtpBlKzG2@!qtk~!nc&=*!Bgb)dm7++0(ZOo5SW$`s;Cv7dQcE)%Q~2$S$IkQ+ zMf$pO^fxY=4$SZQ$bnxT_r2!`cxk9Bp9{OCl4Z$UGsLTTX4zIk*Sucu3D>_V6KY5x?Ds^m$-b-VT-=|jMFdoWMd1f6!6j&?EH>n4yk$?MEU6{WX zoayHNRG}^xhho9-lKXaJ&t-(Wbc7YtJvbqGqykL*-sUqFaLd-SFPq z@aF577)2H3=G7PRW^nbk_#O~nkKfLAgV_r?;*Ux)r0I>EBcr8GzmdoxPYYs-Mk53lYPj(yx003_clP3x_4hVM2H%qhC0SI==H%qgVY6=<#NC*G`004Uf BBj5l4 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码.zip b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntity 纯净版源码.zip index ab1fb53d6f3f718fcb89c9e829b10dcad851ac12..47a9b4d13018fbf8f0544cd4d91eb495eb312a33 100644 GIT binary patch delta 1914 zcmV-=2Zi|fAJ-zV;Rp`&sgh4~cSkl22LJ$D8I$h_9e+u0(?AryBlSNF;bM!*1tcUO zO-fq|s)Q(_0SEUD-gunYaqPxr zk?KN1T0mGzBQ#&|r)r`rgF=gaP*&>uiX_1?-2rj??O!O=> zaEZ_|R!P&`o@K{+mLYih`ub2mwM!*zRkHq&bLmX&;!89POc=>&CDOOETxfod(oIAs zj1*A)?rG=s!|K8{=h5f-+b;o@eeFE=saBIx1_@>T6nU<_DfvMoK(zyM+smU$Q%Wh3HQh$_X#@06((Pze7P8_v};pqYODX7JX>;*>_pjZ0iICWh~$EcR-)8iYp;Eyh19XwfH=~ zrKgilO6beRl@HGB&DzY(#_MnOh1br)H7N7-=Z|VLAGAVuhqfaxWFtr&ix{k_V=T@G z2t%2$ManL$+a!b>ji&?zrue%ZQt!3s)ay{YIwV6h>&{2v)&5Y<+^SI~1-@l4s&Vdx zb78Lf@pEl{w)*h}RKfbY$A4&$F|1C+aNDi13E*N-th!yxFDi5EvWM0DHGqZN@PA_z*+HYnv|)<~($DpDvHq2Onb%O=`l4<%(c50PO^Ra_tv=D7#I zm^M>DR{R2#3Fmv1e!}S<_t5-wY%%oPeb5hP{vdax4&UuHJPZh@;D7qLt<6&*-C62& ziZU)Y*FX^A$3;4VDQ&S#6m}X3avw4560!KvBF2e8zNp4NU%FYdfU7u^L=f?<3xpz) zTxvLKK_vrie62e*?^K7cOQ2Ab+*8Vvkx&jiEo;2sOvh6;t>ODxAm^VvTln8r&x=#f zUk9kc+bnv)BsXnK$bUfD40vqACD{BiY%$6cTS|@F`I6?Ia#y5)V?fK+I$nkOM;AHn zzQZgK7Zle#9x_7}5tc1AHe#|ET$4OV(@A?q0vAmiz&mLcDY~XJ0H%? zZ-N~?Fky@9zQ=m-r26Ik&##wwL-sl`RzPAFtzIR=cmdir5Tkq@FAJuNmc-a3ZE*mXM+&8GDZhtTO9VY@Cp97~ze4SVQa?Lq8 zm-vpfRjNjL@!UbmCe@f}1sZ`r7CfCL&gdU^PCFMKi)(0z7U%w4?cTfE%{Ss41zzNX zvoFM;GkY5@BH`Nl$Ei7I=4=A}g-bkTy>m#HD$8r360j;0Tk%4a;uOUjT?9^2(?gw` zwm|*$s2PE@Lrz=KTN#s; z4>c|(S6DrzwbcP8S6DrzwbcQKA7xsCQPlxZO9ci10000300RIj0RR9O5C8xG0BG-* Ar2qf` delta 1560 zcmV+z2Iu+LBKRM$;Rp_`v~o|AW+23_1pojs6O-=<9e-JG(?Ae@uhjpr_{kQP3rI*n znm~bqA|Z-MfCoTmYj22!kJP&^1cbz`awBoyhlHpQP>>J^XyMP)NqFKfFza<<$BC)S zA>oJE-kF`*`Q~(feEH^4!#;?%xP+7@O?5M7c+|EXhMD2mG&eXP=%qSk#7evd+&yas zK4?3X8Gjm0lC~N4q&jw_<`PQ#NLR~MmtY+hfG{{q#&m}02;E^c%1%GGFn=lOx;R(uItTCjSm{PP6Q!-{V zgVhBWKYe&nz!x?YL(9+s$F+92##BzQq!`&T^z4lP?nJa3HY0!bQ|sMR!Ix%Gbkv>$ zjDv`Lp>qzjem!DU*Ex)Aau|&r(MXNQgSLmCn{IkrtSE&<385i$?8a=k`W z5M(eigd|CaB}5(1)kvNZ%2a(KXW=8L<~Syz#!-@AElFHnpjcLvoTLE2*&uG47FpKC zuw;w7bk?wo3nRn9t(%k%%+h3Jz%L7YOMg(>0eSHl?1-`uPx8D}p_8Um=o8OEm6aO5 zQ;wmd1pXZ{Txw`QJN=?73iW)znCnkfN1d9w$#eCMq~bu{FV7>H4k4oOY$-#s6LpUZ zctU9-asVz`j--9=K3j?-aXf3-&7JVC&H5joFU&viFW>afo?iHT(Z7%(uY+}$K!3Q{ z6g(6@r6>L_0ByXo$8is#jpU$V%iN;y(e_MJ$ykd1?7;CLFv%2wC=mObug^C>zX;v` zH_a?k#|+|R8&|g;ajn0Ik}2#W56WPkS4dT~mPn?obcYRRRl7C7&Ok+iQ5>A}r$kBH z0^SiF+pMEe3MFBiqhWJ|1}P2II)7Lz6C2yCsDmb6dV2ZfjJ|AL`RHH0)tJ83dh@k8 z|Hhxc4rRXi;&Eg8qoFVE&~D^~ZUm|05}UQpn2Pg3!cabGk-8h39!Vfa(>VcwDSq#U zG`#(CbP!gii~^BuhRuju;Uh^=Xbu~DCU~@f~cj$59K8I*1G*nbJ}GY;`H zQWoz8v@S+PhpPmtT1W#@uze|3H6A~2%|2_~eA~GEW^v1wn!Y7sLKln9F5Z6;MG>u+ z9%VEQ#Dqzm&><`89)ne(w%ZhIK}U%aUJc_}#M^pxD`DeqP*~#p6>L%>I$`26Do7UI zg)*@n%Ivs1X4P0-PUHy`<9|F7Vn9gm6;iNu<`eNP- zcw*N-gk5uN-QcxJDt~ZYsB!y4^Ty-G&FK*P|HNg*ip+h3I>#MCzvDy@6G`A4nLqm$ zzFhZD&1C+T?v$z`Z>c*;&7lT!+*q@X*5X|}b4Gu^d&a-;MEqR=(c(XtY21I`xb;@_ zTks-Zy!uis`d9D32P^!&@%{9SKYcF4`2&}9y8kF+SgS5lWjA>(RAW}M2 zF?(?mBWmyD4Ifrktp0}Fz}lmyt4;J{h?J_Kom{xme=O&uzC+~kpOY65&kn7$a!-?H zAjGZ(001!)lk^ZZF5|Xku^pb(0pqr1u^pb(0f!%DT7ps40Z>Z?1^@s600RI604f0h K0JshS0001s^X@GG diff --git a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs index 60ce244a..4b491433 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs +++ b/Extensions/FreeSql.Extensions.BaseEntity/BaseEntityReadOnly.cs @@ -1,7 +1,10 @@ using FreeSql.DataAnnotations; using System; +using System.Collections; +using System.Collections.Generic; using System.Data; using System.Diagnostics; +using System.Linq; using System.Linq.Expressions; using System.Threading; @@ -109,12 +112,47 @@ namespace FreeSql { get { - var select = Orm.Select().WithTransaction(UnitOfWork.Current.Value?.GetOrBeginTransaction(false)); + var select = Orm.Select() + .TrackToList(TrackToList) //自动为每个元素 Attach + .WithTransaction(UnitOfWork.Current.Value?.GetOrBeginTransaction(false)); if (string.IsNullOrEmpty(CurrentTenantId) == false) select.WhereCascade(a => (a as ITenant).TenantId == CurrentTenantId); return select.WhereCascade(a => (a as BaseEntity).IsDeleted == false); } } + + static void TrackToList(object list) + { + if (list == null) return; + var ls = list as IList; + if (ls == null) + { + var ie = list as IEnumerable; + if (ie == null) return; + var isFirst = true; + foreach (var item in ie) + { + if (item == null) return; + if (isFirst) + { + isFirst = false; + var itemType = item.GetType(); + if (itemType == typeof(object)) return; + if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; + if (Orm.CodeFirst.GetTableByEntity(itemType)?.Primarys.Any() != true) return; + if (item is BaseEntity == false) return; + } + (item as BaseEntity)?.Attach(); + } + return; + } + if (ls.Any() == false) return; + if (ls.FirstOrDefault() is BaseEntity == false) return; + if (Orm.CodeFirst.GetTableByEntity(typeof(TEntity))?.Primarys.Any() != true) return; + foreach (var item in ls) + (item as BaseEntity)?.Attach(); + } + /// /// 设置当前租户id /// diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index d9f91124..dc0203b8 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -110,13 +110,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 64a4e184..97eb81b3 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1037,7 +1037,7 @@ 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求 - 如:select.AsAlias((_, oldAlias) => oldAlias + " with(lock)") + 如:select.AsAlias((_, old) => $"{old} with(lock)") @@ -2146,6 +2146,137 @@ + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + + + + + + + 查询 + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + + + + + + + + 查询 + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) + + + + + + 可自定义解析表达式 @@ -2924,160 +3055,3 @@ -unc{``0,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})"> - - 使用 or 拼接两个 lambda 表达式 - - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - - true 时生效 - - - - - 生成类似Mongodb的ObjectId有序、不重复Guid - - - - - - 插入数据 - - - - - - - 插入数据,传入实体 - - - - - - - - 插入数据,传入实体数组 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步),60秒未执行完成(可能)被其他线程事务自动提交 - - 事务体 () => {} - - - - 开启事务(不支持异步) - - 超时,未执行完成(可能)被其他线程事务自动提交 - 事务体 () => {} - - - - 开启事务(不支持异步) - - - 事务体 () => {} - 超时,未执行完成(可能)被其他线程事务自动提交 - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index a9366d41..363d8249 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -124,7 +124,7 @@ namespace FreeSql TSelect AsTable(Func tableRule); /// /// 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求 - /// 如:select.AsAlias((_, oldAlias) => oldAlias + " with(lock)") + /// 如:select.AsAlias((_, old) => $"{old} with(lock)") /// /// ///