From 85485dab3206d2d20932165fd0fcc4d06b55dc65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=BA=E8=83=BD=E5=A4=A7=E7=9F=B3=E5=A4=B4?= Date: Tue, 22 Jul 2025 22:13:53 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E5=BC=82=E6=AD=A5=E7=89=88DoAction?= =?UTF-8?q?=E9=9C=80=E8=A6=81await=E6=89=A7=E8=A1=8C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=EF=BC=8C=E5=90=A6=E5=88=99Shard=E5=AF=B9=E8=B1=A1=E7=9A=84?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=8F=AF=E8=83=BD=E6=9C=89=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XCode/Entity/Entity.cs | 48 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/XCode/Entity/Entity.cs b/XCode/Entity/Entity.cs index ff2870bc4..2c718ae32 100644 --- a/XCode/Entity/Entity.cs +++ b/XCode/Entity/Entity.cs @@ -187,6 +187,38 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent /// protected virtual Int32 OnDelete() => Meta.Session.Delete(this); + /// 执行操作。Valid后,自动填充雪花Id主键 + private TResult DoAction(Func func, DataMethod method) + { + if (Meta.Table.DataTable.InsertOnly) + { + switch (method) + { + case DataMethod.Update: + throw new XCodeException($"只写的日志型数据[{Meta.ThisType.FullName}]禁止修改!"); + case DataMethod.Delete: + throw new XCodeException($"只写的日志型数据[{Meta.ThisType.FullName}]禁止删除!"); + } + } + + if (_enableValid) + { + var rt = Valid(method); + + // 没有更新任何数据 + if (!rt) return (TResult)(Object)0; + } + + AutoFillSnowIdPrimaryKey(); + + if (Meta.InShard) return func(); + + // 自动分库分表 + using var split = Meta.CreateShard((this as TEntity)!); + + return func(); + } + /// 保存。Insert/Update/Upsert /// /// Save的几个场景: @@ -279,7 +311,7 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent /// 插入数据,Valid后调用 /// - public override Task InsertAsync() => DoAction(OnInsertAsync, DataMethod.Insert); + public override Task InsertAsync() => DoActionAsync(OnInsertAsync, DataMethod.Insert); /// 把该对象持久化到数据库,添加/更新实体缓存。 /// @@ -298,7 +330,7 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent /// 更新数据,Valid后调用 /// - public override Task UpdateAsync() => DoAction(OnUpdateAsync, DataMethod.Update); + public override Task UpdateAsync() => DoActionAsync(OnUpdateAsync, DataMethod.Update); /// 更新数据库,同时更新实体缓存 /// @@ -319,7 +351,7 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent /// 如果需要避开该机制,请清空脏数据。 /// /// - public override Task DeleteAsync() => DoAction(OnDeleteAsync, DataMethod.Delete); + public override Task DeleteAsync() => DoActionAsync(OnDeleteAsync, DataMethod.Delete); /// 从数据库中删除该对象,同时从实体缓存中删除 /// @@ -328,7 +360,9 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent #if NETCOREAPP [StackTraceHidden] #endif - private TResult DoAction(Func func, DataMethod method) + + /// 执行操作。Valid后,自动填充雪花Id主键 + private async Task DoActionAsync(Func> func, DataMethod method) { if (Meta.Table.DataTable.InsertOnly) { @@ -346,17 +380,17 @@ public partial class Entity : EntityBase, IAccessor where TEntity : Ent var rt = Valid(method); // 没有更新任何数据 - if (!rt) return typeof(TResult) == typeof(Task) ? (TResult)(Object)Task.FromResult(0) : (TResult)(Object)0; + if (!rt) return (TResult)(Object)0; } AutoFillSnowIdPrimaryKey(); - if (Meta.InShard) return func(); + if (Meta.InShard) return await func().ConfigureAwait(false); // 自动分库分表 using var split = Meta.CreateShard((this as TEntity)!); - return func(); + return await func().ConfigureAwait(false); } [NonSerialized]