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]