From ffb7d3823bdfe0ea874e3faaa0e1663182693a40 Mon Sep 17 00:00:00 2001 From: yangl <303550688@qq.com> Date: Wed, 29 Oct 2025 21:06:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?PG=E4=B8=B4=E6=97=B6=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=88=96=E6=9B=B4=E6=96=B0=E6=97=B6=E8=87=AA?= =?UTF-8?q?=E5=A2=9E=E4=B8=BB=E9=94=AE=E4=B8=8D=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Curd/PostgreSQLInsertOrUpdateTest.cs | 26 +++++++++++++++++++ .../Curd/PostgreSQLInsertOrUpdate.cs | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs index fb0b8be92..45f141891 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs @@ -98,11 +98,37 @@ ON CONFLICT(""id"") DO UPDATE SET var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); } + class tbiou02 { public int id { get; set; } public string name { get; set; } } + + [Fact] + public void InsertOrUpdate_TempPrimary() + { + fsql.Delete().Where("1=1").ExecuteAffrows(); + var iou = fsql.InsertOrUpdate().SetSource(new tbiou_temp { name = "01", description = "testval" }, m => new { m.name }); + var sql = iou.ToSql(); + Assert.Equal(@"INSERT INTO ""tbiou_temp""(""name"", ""description"") VALUES('01', 'testval') +ON CONFLICT(""name"") DO UPDATE SET +""description"" = EXCLUDED.""description""", sql); + Assert.Equal(1, iou.ExecuteAffrows()); + + var iou2 = fsql.InsertOrUpdate().SetSource(new tbiou_temp { name = "01", description = "testval2" }, m => new { m.name }).ExecuteAffrows(); + Assert.Equal(1, iou2); + + } + [Index("uix_tbiou_temp_name", "name", true)] + class tbiou_temp + { + [Column(IsPrimary = true, IsIdentity = true)] + public int id { get; set; } + + public string name { get; set; } + public string description { get; set; } + } [Fact] public void InsertOrUpdate_OnePrimaryAndIdentity() { diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs index da45a72ca..52e6bd4c4 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs @@ -58,7 +58,7 @@ namespace FreeSql.PostgreSQL.Curd if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); else { - var ocdu = new OnConflictDoUpdate(insert.InsertIdentity()); + var ocdu = new OnConflictDoUpdate(_tempPrimarys?.Length > 0 ? insert : insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); From cf7d8f7740de31809ad95bb8cef7b655aadb52bb Mon Sep 17 00:00:00 2001 From: 28810 <2881099@qq.com> Date: Fri, 31 Oct 2025 08:51:07 +0800 Subject: [PATCH 2/2] #2133 --- .../PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs | 2 +- .../Curd/KingbaseESInsertOrUpdate.cs | 2 +- .../PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs index ed3716f17..03725d1ea 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs @@ -56,7 +56,7 @@ namespace FreeSql.Custom.PostgreSQL if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); else { - var ocdu = new CustomPostgreSQLOnConflictDoUpdate(insert.InsertIdentity()); + var ocdu = new CustomPostgreSQLOnConflictDoUpdate(_tempPrimarys?.Length > 0 ? insert : insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs index 511c09617..13da52b11 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs @@ -56,7 +56,7 @@ namespace FreeSql.KingbaseES if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); else { - var ocdu = new KingbaseESOnConflictDoUpdate(insert.InsertIdentity()); + var ocdu = new KingbaseESOnConflictDoUpdate(_tempPrimarys?.Length > 0 ? insert : insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs index e0a60d74e..340db0ce1 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs @@ -56,7 +56,7 @@ namespace FreeSql.Odbc.PostgreSQL if (IdentityColumn != null && flagInsert) sql = insert.ToSql(); else { - var ocdu = new OdbcPostgreSQLOnConflictDoUpdate(insert.InsertIdentity()); + var ocdu = new OdbcPostgreSQLOnConflictDoUpdate(_tempPrimarys?.Length > 0 ? insert : insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false);