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 @@ string getInsertSql(List data, bool flagInsert, bool noneParameter) 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);