From d55e6782d42446d7fbe6066cff7e34c34604709d Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 3 Mar 2023 16:47:06 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IInsertOrUpdate=20SetS?= =?UTF-8?q?ource=20tempPrimary=20=E8=87=AA=E5=A2=9E=E7=9A=84=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E6=8F=92=E5=85=A5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 + .../MySql/MySqlExpression/StringTest.cs | 8 + FreeSql/FreeSql.xml | 402 ++++++++---------- .../Oracle/Curd/CustomOracleInsertOrUpdate.cs | 7 +- .../Curd/CustomSqlServerInsertOrUpdate.cs | 7 +- .../Curd/DamengInsertOrUpdate.cs | 7 +- .../Curd/FirebirdInsertOrUpdate.cs | 7 +- .../Curd/GBaseInsertOrUpdate.cs | 7 +- .../Dameng/Curd/OdbcDamengInsertOrUpdate.cs | 7 +- .../Oracle/Curd/OdbcOracleInsertOrUpdate.cs | 7 +- .../Curd/OdbcSqlServerInsertOrUpdate.cs | 7 +- .../Curd/OracleInsertOrUpdate.cs | 7 +- .../Curd/ShenTongInsertOrUpdate.cs | 7 +- .../Curd/SqlServerInsertOrUpdate.cs | 7 +- 14 files changed, 266 insertions(+), 230 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/StringTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/StringTest.cs index f7e65567..7ce725f0 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/StringTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlExpression/StringTest.cs @@ -74,6 +74,14 @@ namespace FreeSql.Tests.MySqlExpression val1 = string.Join("**", fsql.Select().ToList(a => a.id)); val2 = fsql.Select().ToList(a => string.Join("**", fsql.Select().As("b").ToList(b => b.id))); Assert.Equal(val1, val2[0]); + + //val1 = string.Join("**", fsql.Select().ToList(a => a.name)); + //val2 = fsql.Select().ToList(a => string.Join("**", fsql.Select().As("b").GroupBy(b => b.name).WithTempQuery(b => new { b.Key }).ToList(b => b.Key))); + //Assert.Equal(val1, val2[0]); + + //val1 = string.Join("**", fsql.Select().ToList(a => a.id)); + //val2 = fsql.Select().ToList(a => string.Join("**", fsql.Select().As("b").GroupBy(b => b.id).WithTempQuery(b => new { b.Key }).ToList(b => b.Key))); + //Assert.Equal(val1, val2[0]); } class StringJoin01 { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 89bb8aa1..9ee27a8e 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3349,6 +3349,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行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 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4339,6 +4510,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4414,6 +4591,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 @@ -5855,222 +6038,3 @@ -ystem.Boolean}})"> - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 使用 and 拼接两个 lambda 表达式 - - - - - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 生成类似Mongodb的ObjectId有序、不重复Guid - - - - - - 插入数据 - - - - - - - 插入数据,传入实体 - - - - - - - - 插入数据,传入实体数组 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | 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} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs index e68b6d57..b745f1f0 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Custom.Oracle ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs index 2d8ea831..20996bb6 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs @@ -50,10 +50,15 @@ namespace FreeSql.Custom.SqlServer ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(");"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(");"); if (IdentityColumn != null) sb.Append(";\r\nSET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" OFF;"); diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs index cda02841..af9f6679 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Dameng.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs index e1d80816..d4161183 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Firebird.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs index 17d48e6b..184a9c9d 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.GBase.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs index d5c7b4ce..050f08b2 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Odbc.Dameng ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs index ce772001..530cffa0 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Odbc.Oracle ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs index 28c545dc..ca191076 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs @@ -50,10 +50,15 @@ namespace FreeSql.Odbc.SqlServer ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(");"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(");"); if (IdentityColumn != null) sb.Append(";\r\nSET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" OFF;"); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs index aac48225..c3bf97c4 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.Oracle.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs index f938d5d7..e0aa0be9 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs @@ -48,10 +48,15 @@ namespace FreeSql.ShenTong.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(")"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(")"); return sb.ToString(); } diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs index 04048ba9..0110a006 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs @@ -50,10 +50,15 @@ namespace FreeSql.SqlServer.Curd ))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); + if (_tempPrimarys.Any(b => b.Attribute.IsIdentity) == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); if (cols.Any()) sb.Append("WHEN NOT MATCHED THEN \r\n") .Append(" insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n") - .Append(" values (").Append(string.Join(", ", cols.Select(a => $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(");"); + .Append(" values (").Append(string.Join(", ", cols.Select(a => + { + if (string.IsNullOrEmpty(a.DbInsertValue) == false) return a.DbInsertValue; + return $"t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(");"); if (IdentityColumn != null) sb.Append(";\r\nSET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" OFF;");