From 06b301395fa4d8d6abfaaba473ded97bd25e3bb2 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Wed, 29 Jul 2020 15:32:14 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E8=A1=A5=E5=85=85=20fsql.InsertOrUpdate=20?=
=?UTF-8?q?UpdateColumns=20=E6=95=B0=E6=8D=AE=E5=AD=98=E5=9C=A8=E6=97=B6?=
=?UTF-8?q?=E5=8F=AA=E6=9B=B4=E6=96=B0=E6=8C=87=E5=AE=9A=E7=9A=84=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 7 ++++
.../RepositoryTests.cs | 1 +
FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 2 ++
FreeSql/FreeSql.xml | 14 ++++++++
FreeSql/Interface/Curd/IInsertOrUpdate.cs | 13 +++++++
.../CommonProvider/InsertOrUpdateProvider.cs | 34 +++++++++++++------
.../Curd/DamengInsertOrUpdate.cs | 2 +-
.../Curd/MySqlInsertOrUpdate.cs | 7 +++-
.../Dameng/Curd/OdbcDamengInsertOrUpdate.cs | 2 +-
.../Curd/OdbcKingbaseESInsertOrUpdate.cs | 5 +--
.../MySql/Curd/OdbcMySqlInsertOrUpdate.cs | 7 +++-
.../Oracle/Curd/OdbcOracleInsertOrUpdate.cs | 2 +-
.../Curd/OdbcPostgreSQLInsertOrUpdate.cs | 5 +--
.../Curd/OdbcSqlServerInsertOrUpdate.cs | 2 +-
.../Curd/OracleInsertOrUpdate.cs | 2 +-
.../Curd/PostgreSQLInsertOrUpdate.cs | 5 +--
.../Curd/ShenTongInsertOrUpdate.cs | 2 +-
.../Curd/SqlServerInsertOrUpdate.cs | 2 +-
.../Curd/SqliteInsertOrUpdate.cs | 1 +
19 files changed, 89 insertions(+), 26 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 132d875e..474ea8d5 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -125,6 +125,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs
index 3804be96..d7630a0a 100644
--- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs
+++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs
@@ -296,6 +296,7 @@ namespace FreeSql.Tests
public void EnableAddOrUpdateNavigateList_OneToMany()
{
var repo = g.sqlite.GetRepository();
+ repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
var cts = new[] {
new Cagetory
{
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
index 5125fee2..c8761dff 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs
@@ -159,6 +159,8 @@ namespace FreeSql.Tests
[Fact]
public void Test03()
{
+ var sqlxx = g.pgsql.InsertOrUpdate().SetSource(new userinfo { userid = 10 }).UpdateColumns(a => new { a.birthday, a.CardNo }).ToSql();
+
var aff1 = g.sqlite.GetRepository().Delete(10086);
var aff2 = g.sqlite.Delete(10086).ExecuteAffrows();
Assert.Equal(aff1, aff2);
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 2fcf5adc..78dd9783 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1165,6 +1165,20 @@
+
+
+ 当记录存在时,指定只更新的字段,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"})
+
+ lambda选择列
+
+
+
+
+ 当记录存在时,指定只更新的字段
+
+ 属性名,或者字段名
+
+
设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
diff --git a/FreeSql/Interface/Curd/IInsertOrUpdate.cs b/FreeSql/Interface/Curd/IInsertOrUpdate.cs
index 639a3ac2..53698f3f 100644
--- a/FreeSql/Interface/Curd/IInsertOrUpdate.cs
+++ b/FreeSql/Interface/Curd/IInsertOrUpdate.cs
@@ -42,6 +42,19 @@ namespace FreeSql
///
IInsertOrUpdate IfExistsDoNothing();
+ ///
+ /// 当记录存在时,指定只更新的字段,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"})
+ ///
+ /// lambda选择列
+ ///
+ IInsertOrUpdate UpdateColumns(Expression> columns);
+ ///
+ /// 当记录存在时,指定只更新的字段
+ ///
+ /// 属性名,或者字段名
+ ///
+ IInsertOrUpdate UpdateColumns(string[] columns);
+
///
/// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名;
///
diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs
index 310ecdb7..c67fd47c 100644
--- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs
+++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs
@@ -15,17 +15,18 @@ namespace FreeSql.Internal.CommonProvider
public abstract partial class InsertOrUpdateProvider : IInsertOrUpdate where T1 : class
{
- protected IFreeSql _orm;
- protected CommonUtils _commonUtils;
- protected CommonExpression _commonExpression;
- protected List _source = new List();
- protected bool _doNothing = false;
- protected Dictionary _auditValueChangedDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
- protected TableInfo _table;
- protected Func _tableRule;
- protected DbParameter[] _params;
- protected DbTransaction _transaction;
- protected DbConnection _connection;
+ public IFreeSql _orm;
+ public CommonUtils _commonUtils;
+ public CommonExpression _commonExpression;
+ public List _source = new List();
+ public bool _doNothing = false;
+ public Dictionary _updateIgnore = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
+ public Dictionary _auditValueChangedDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
+ public TableInfo _table;
+ public Func _tableRule;
+ public DbParameter[] _params;
+ public DbTransaction _transaction;
+ public DbConnection _connection;
public ColumnInfo IdentityColumn { get; }
public InsertOrUpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
@@ -57,6 +58,17 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
+ public IInsertOrUpdate UpdateColumns(Expression> columns) => UpdateColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, columns?.Body, false, null));
+ public IInsertOrUpdate UpdateColumns(string[] columns)
+ {
+ var cols = columns.Distinct().ToDictionary(a => a);
+ _updateIgnore.Clear();
+ foreach (var col in _table.Columns.Values)
+ if (cols.ContainsKey(col.Attribute.Name) == false && cols.ContainsKey(col.CsName) == false)
+ _updateIgnore.Add(col.Attribute.Name, true);
+ return this;
+ }
+
public static void AuditDataValue(object sender, IEnumerable data, IFreeSql orm, TableInfo table, Dictionary changedDict)
{
if (data?.Any() != true) return;
diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs
index d4da4540..92cf3456 100644
--- a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs
@@ -37,7 +37,7 @@ namespace FreeSql.Dameng.Curd
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs
index d2fe72dd..9a275be2 100644
--- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs
@@ -44,7 +44,12 @@ namespace FreeSql.MySql.Curd
{
insert.InsertIdentity();
if (_doNothing == false)
- sql = new OnDuplicateKeyUpdate(insert).ToSql();
+ {
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
+ sql = new OnDuplicateKeyUpdate(insert)
+ .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray())
+ .ToSql();
+ }
else
{
if (_table.Primarys.Any() == false) throw new Exception($"fsql.InsertOrUpdate + IfExistsDoNothing + MySql 要求实体类 {_table.CsName} 必须有主键");
diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs
index ed5f4257..fccbb8ad 100644
--- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs
@@ -37,7 +37,7 @@ namespace FreeSql.Odbc.Dameng
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs
index 4dce4686..d4258280 100644
--- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs
@@ -43,8 +43,9 @@ namespace FreeSql.Odbc.KingbaseES
else
{
var ocdu = new OdbcKingbaseESOnConflictDoUpdate(insert.InsertIdentity());
- ocdu.IgnoreColumns(_table.Columns.Values.Where(a => a.Attribute.CanUpdate == false).Select(a => a.Attribute.Name).ToArray());
- if (_doNothing == true || _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true).Any() == false)
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
+ ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray());
+ if (_doNothing == true || cols.Any() == false)
ocdu.DoNothing();
sql = ocdu.ToSql();
}
diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs
index 65f8affa..38c5dfab 100644
--- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs
@@ -43,7 +43,12 @@ namespace FreeSql.Odbc.MySql
{
insert.InsertIdentity();
if (_doNothing == false)
- sql = new OdbcMySqlOnDuplicateKeyUpdate(insert).ToSql();
+ {
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
+ sql = new OdbcMySqlOnDuplicateKeyUpdate(insert)
+ .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray())
+ .ToSql();
+ }
else
{
if (_table.Primarys.Any() == false) throw new Exception($"fsql.InsertOrUpdate + IfExistsDoNothing + MySql 要求实体类 {_table.CsName} 必须有主键");
diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs
index 7ea43d2f..d87a9204 100644
--- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs
@@ -37,7 +37,7 @@ namespace FreeSql.Odbc.Oracle
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs
index 2f3a8a0f..c709a6d3 100644
--- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs
@@ -41,8 +41,9 @@ namespace FreeSql.Odbc.PostgreSQL
else
{
var ocdu = new OdbcPostgreSQLOnConflictDoUpdate(insert.InsertIdentity());
- ocdu.IgnoreColumns(_table.Columns.Values.Where(a => a.Attribute.CanUpdate == false).Select(a => a.Attribute.Name).ToArray());
- if (_doNothing == true || _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true).Any() == false)
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
+ ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray());
+ if (_doNothing == true || cols.Any() == false)
ocdu.DoNothing();
sql = ocdu.ToSql();
}
diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs
index d4e711b2..bb702281 100644
--- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs
@@ -39,7 +39,7 @@ namespace FreeSql.Odbc.SqlServer
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs
index 36d50d18..4758bec8 100644
--- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs
@@ -37,7 +37,7 @@ namespace FreeSql.Oracle.Curd
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs
index c3a8461c..7af97ef1 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs
@@ -41,8 +41,9 @@ namespace FreeSql.PostgreSQL.Curd
else
{
var ocdu = new OnConflictDoUpdate(insert.InsertIdentity());
- ocdu.IgnoreColumns(_table.Columns.Values.Where(a => a.Attribute.CanUpdate == false).Select(a => a.Attribute.Name).ToArray());
- if (_doNothing == true || _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true).Any() == false)
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
+ ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray());
+ if (_doNothing == true || cols.Any() == false)
ocdu.DoNothing();
sql = ocdu.ToSql();
}
diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs
index b03afa5a..302343b7 100644
--- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs
@@ -37,7 +37,7 @@ namespace FreeSql.ShenTong.Curd
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs
index d9834bd8..e844e2c3 100644
--- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs
@@ -39,7 +39,7 @@ namespace FreeSql.SqlServer.Curd
WriteSourceSelectUnionAll(data, sb, dbParams);
sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
- var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true);
+ var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
if (_doNothing == false && cols.Any())
sb.Append("WHEN MATCHED THEN \r\n")
.Append(" update set ").Append(string.Join(", ", cols.Select(a =>
diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs
index 3d028dbe..2e0b442e 100644
--- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs
+++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs
@@ -44,6 +44,7 @@ namespace FreeSql.Sqlite.Curd
insert.InsertIdentity();
if (_doNothing == false)
{
+ if (_updateIgnore.Any()) throw new Exception($"fsql.InsertOrUpdate Sqlite 无法完成 UpdateColumns 操作");
sql = insert.ToSql();
if (sql?.StartsWith("INSERT INTO ") == true)
sql = $"REPLACE INTO {sql.Substring("INSERT INTO ".Length)}";