From 358023fd25c200cfb8196be5c15d78463805647e Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 28 May 2023 20:32:17 +0800 Subject: [PATCH] SplitTableAttribute(SplitType splitType,Type customSplitTableService) --- .../CodeFirstProvider/CodeFirstProvider.cs | 2 ++ .../DeleteProvider/DeleteableProvider.cs | 2 ++ .../InsertableProvider/InsertableProvider.cs | 2 ++ .../UpdateProvider/UpdateableProvider.cs | 2 ++ .../SpliteTable/SplitTableAttribute.cs | 10 ++++++++++ Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs | 18 ++++++++++++++++++ 6 files changed, 36 insertions(+) diff --git a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs index e67d4dbcc..52aeea891 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs @@ -54,8 +54,10 @@ namespace SqlSugar var mappingInfo=this.Context.MappingTables.FirstOrDefault(it => it.EntityName == entityType.Name); if (mappingInfo == null) { + UtilMethods.StartCustomSplitTable(this.Context,entityType); this.Context.CodeFirst.SplitTables().InitTables(entityType); this.Context.MappingTables.RemoveAll(it=>it.EntityName==entityType.Name); + UtilMethods.EndCustomSplitTable(this.Context, entityType); return; } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 2cd204836..0ad3adea4 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -360,6 +360,7 @@ namespace SqlSugar var tables = getTableNamesFunc(helper.GetTables()); result.Tables = tables; result.deleteobj = this; + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); return result; } public SplitTableDeleteByObjectProvider SplitTable() @@ -373,6 +374,7 @@ namespace SqlSugar EntityInfo = this.EntityInfo }; result.deleteobj = this; + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); return result; } public LogicDeleteProvider IsLogic() diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index cb43cbf71..3e2948389 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -665,6 +665,7 @@ namespace SqlSugar } public SplitInsertable SplitTable(SplitType splitType) { + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); SplitTableContext helper = new SplitTableContext(Context) { EntityInfo = this.EntityInfo @@ -688,6 +689,7 @@ namespace SqlSugar public SplitInsertable SplitTable() { + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); var splitTableAttribute = typeof(T).GetCustomAttribute(); if (splitTableAttribute != null) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index 7460a9453..d1058d5c5 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -221,6 +221,7 @@ namespace SqlSugar } public SplitTableUpdateProvider SplitTable(Func, IEnumerable> getTableNamesFunc) { + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); this.Context.MappingTables.Add(this.EntityInfo.EntityName, this.EntityInfo.DbTableName); SplitTableUpdateProvider result = new SplitTableUpdateProvider(); result.Context = this.Context; @@ -235,6 +236,7 @@ namespace SqlSugar } public SplitTableUpdateByObjectProvider SplitTable() { + UtilMethods.StartCustomSplitTable(this.Context, typeof(T)); Check.ExceptionEasy(UpdateParameterIsNull, "SplitTable() not supported db.Updateable(),use db.Updateable(list)", ".SplitTable()不支持 db.Updateable()方式更新,请使用 db.Updateable(list) 对象方式更新, 或者使用 .SplitTable(+1)重载"); SplitTableUpdateByObjectProvider result = new SplitTableUpdateByObjectProvider(); result.Context = this.Context; diff --git a/Src/Asp.Net/SqlSugar/SpliteTable/SplitTableAttribute.cs b/Src/Asp.Net/SqlSugar/SpliteTable/SplitTableAttribute.cs index 3a1cfcd69..301db92e7 100644 --- a/Src/Asp.Net/SqlSugar/SpliteTable/SplitTableAttribute.cs +++ b/Src/Asp.Net/SqlSugar/SpliteTable/SplitTableAttribute.cs @@ -10,10 +10,20 @@ namespace SqlSugar public class SplitTableAttribute : Attribute { public SplitType SplitType { get; set; } + public Type CustomSplitTableService { get; set; } public SplitTableAttribute(SplitType splitType) { this.SplitType = splitType; } + public SplitTableAttribute(SplitType splitType,Type customSplitTableService) + { + this.SplitType = splitType; + if (!customSplitTableService.GetInterfaces().Any(it => it == typeof(ISplitTableService))) + { + Check.ExceptionEasy("customSplitTableService in SplitTableAttribute(SplitType splitType,Type customSplitTableService) must be inherited ISplitTableService", " SplitTableAttribute(SplitType splitType,Type customSplitTableService) 中的 customSplitTableService 必须继承 ISplitTableService"); + } + this.CustomSplitTableService= customSplitTableService; + } } [AttributeUsage(AttributeTargets.Property, Inherited = true)] diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index 1f1bef142..f36fa9526 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -17,6 +17,24 @@ namespace SqlSugar { public class UtilMethods { + internal static void EndCustomSplitTable(ISqlSugarClient context,Type entityType) + { + var splitTableAttribute = entityType.GetCustomAttribute(); + if (splitTableAttribute.CustomSplitTableService != null) + { + context.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService = null; + } + } + + internal static void StartCustomSplitTable(ISqlSugarClient context, Type entityType) + { + var splitTableAttribute = entityType.GetCustomAttribute(); + if (splitTableAttribute.CustomSplitTableService != null) + { + context.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService + = (ISplitTableService)Activator.CreateInstance(splitTableAttribute.CustomSplitTableService); + } + } public static void ConvertParameter(SugarParameter p, ISqlBuilder builder) { if (!p.ParameterName.StartsWith(builder.SqlParameterKeyWord))