From 0039a7a0fe764dd63bae4479071355f50830e5ac Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 28 Feb 2025 11:46:15 +0800 Subject: [PATCH] Synchronization code --- .../QueryableProvider/NavigatManager.cs | 11 ++++ .../SugarProvider/SqlSugarProvider.cs | 4 ++ .../UpdateProvider/UpdateableProviderT2.cs | 1 + .../Entities/NavigationInitializer.cs | 61 +++++++++++++++++++ Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs | 7 ++- 6 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/Entities/NavigationInitializer.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index 75a1f0c30..73d6afb75 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -392,6 +392,17 @@ namespace SqlSugar FieldValue = String.Join(",", ids), CSharpTypeName = navPkColumn?.UnderType?.Name })); + if (OneToOneGlobalInstanceRegistry.IsAny()) + { + foreach (var item in list) + { + var firstObj = navObjectNamePropety.GetValue(item); + if (OneToOneGlobalInstanceRegistry.IsNavigationInitializerCreated(firstObj)) + { + navObjectNamePropety.SetValue(item,null); + } + } + } if (list.Any()&&navObjectNamePropety.GetValue(list.First()) == null) { var sqlObj = GetWhereSql(db,navObjectNameColumnInfo.Navigat.Name); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index d5b314a37..c1c31612f 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -1676,6 +1676,10 @@ namespace SqlSugar .TrimEnd('\r') .TrimEnd('\n') .TrimEnd(';') + ";"; + if (itemSql?.StartsWith("INSERT INTO ")==true&&itemSql?.EndsWith(" returning ;") == true) + { + itemSql = itemSql.Replace(" returning ;", " ;"); + } if (itemSql == "begin;" ) { itemSql = itemSql.TrimEnd(';')+"\n"; diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs index ef997c9f9..9a276e781 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProviderT2.cs @@ -39,6 +39,7 @@ namespace SqlSugar var items=ExpressionTool.GetMemberBindingItemList(exp); var UpdateBuilder = updateableObj.UpdateBuilder; var SqlBuilder = UpdateBuilder.Builder; + UpdateBuilder.LambdaExpressions.IsSingle = false; foreach (var item in items) { var dbColumnName=updateableObj.UpdateBuilder.Context.EntityMaintenance.GetDbColumnName(item.Key); diff --git a/Src/Asp.Net/SqlSugar/Entities/NavigationInitializer.cs b/Src/Asp.Net/SqlSugar/Entities/NavigationInitializer.cs new file mode 100644 index 000000000..0eda195b2 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Entities/NavigationInitializer.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Reflection.Emit; +using System.Reflection; +using System.Text; + +namespace SqlSugar +{ + internal static class OneToOneGlobalInstanceRegistry + { + private static readonly Dictionary _instances = new Dictionary(); + private static readonly object _lock = new object(); + + public static Dictionary Instances => _instances; + + public static bool IsAny() + { + return _instances?.Count>0; + } + public static bool IsNavigationInitializerCreated(object instance) + { + if (instance == null) + return false; + + Type type = instance.GetType(); + + lock (_lock) + { + return _instances.ContainsKey(type) && _instances[type] == instance; + } + } + + public static void RegisterInstance(Type type, object instance) + { + lock (_lock) + { + if (!_instances.ContainsKey(type)) + { + _instances[type] = instance; + } + } + } + } + + public class OneToOneInitializer where T : new() + { + public static implicit operator T(OneToOneInitializer initializer) + { + Type type = typeof(T); + + if (!OneToOneGlobalInstanceRegistry.Instances.ContainsKey(type)) + { + T instance = new T(); + OneToOneGlobalInstanceRegistry.RegisterInstance(type, instance); + } + + return (T)OneToOneGlobalInstanceRegistry.Instances[type]; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 71f08be94..503b1524d 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -166,6 +166,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index 134f11607..a893027cf 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -1580,6 +1580,7 @@ namespace SqlSugar } public static string GetSqlString(ConnectionConfig connectionConfig,KeyValuePair> sqlObj) { + var guid = Guid.NewGuid()+""; var result = sqlObj.Key; if (sqlObj.Value != null) { @@ -1657,15 +1658,15 @@ namespace SqlSugar } else if (connectionConfig.MoreSettings?.DisableNvarchar == true || item.DbType == System.Data.DbType.AnsiString || connectionConfig.DbType == DbType.Sqlite) { - result = result.Replace(item.ParameterName, $"'{item.Value.ObjToString().ToSqlFilter()}'"); + result = result.Replace(item.ParameterName, $"'{item.Value.ObjToString().Replace("@",guid).ToSqlFilter()}'"); } else { - result = result.Replace(item.ParameterName, $"N'{item.Value.ObjToString().ToSqlFilter()}'"); + result = result.Replace(item.ParameterName, $"N'{item.Value.ObjToString().Replace("@", guid).ToSqlFilter()}'"); } } } - + result = result.Replace(guid, "@"); return result; } public static string ByteArrayToPostgreByteaLiteral(byte[] data)