dotnetcore / dotnetcore/FreeSql

InsertOrUpdate 与自增列

Open
#2,041 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
4.4k
Forks
910
PR merge metrics
No merged PRs in 30d

Description

#### Feature 特性
当自增列为非主键时,调用InsertOrUpdate方法,无法忽略自增列,导致自增列的输入数据永久为默认值0,例,pg数据库:`defect_id`为自增列,`defect_md5 `为主键
```sql
CREATE TABLE public.defect (
defect_id bigserial NOT NULL,
defect_md5 bpchar(32) NOT NULL,
"label" varchar(64) NOT NULL,
CONSTRAINT defect_pkey PRIMARY KEY (defect_md5)
)
CREATE INDEX defect_id_idx ON public.defect USING btree (defect_id);
```
使用Insert+OnConflictDoUpdate方法输出sql:
```c#
var sql = DbHelper.FreeSql.Insert(new List{"test"}.Select(item => new DefectEntity
{
defect_md5 = (item + AppConst.Part).GetMD5(),
label = item
}))
.OnConflictDoUpdate(r=>r.defect_md5)
.IgnoreColumns(r=>r.defect_id)
.ToSql();
```
```sql
INSERT INTO "defect"("defect_id", "defect_md5", "label", ) VALUES(@defect_id_0, @defect_md5_0, @label_0)
ON CONFLICT("defect_md5") DO UPDATE SET
"defect_md5" = EXCLUDED."defect_md5",
"label" = EXCLUDED."label",
```

使用InsertOrUpdate方法输出
```c#
var sql = DbHelper.FreeSql.InsertOrUpdate()
.SetSource(new List{"test"}.Select(item => new DefectEntity
{
defect_md5 = (item + AppConst.Part).GetMD5(),
label = item
}), r => r.defect_md5)
.ToSql();
```
```sql
INSERT INTO "defect"("defect_id", "defect_md5", "label") VALUES(@defect_id_0, @defect_md5_0, @label_0)
ON CONFLICT("defect_md5") DO UPDATE SET
"label" = EXCLUDED."label",
```

#### 简要描述原因

需要忽略掉自增列,并且我在实体中已经配置了,`CanInsert =false`,仍然无效
```c#
///
/// 缺陷id
///
[Column(IsPrimary = true, IsIdentity = true, CanInsert = false, CanUpdate = false)]
public long defect_id { get; set; }
```

#### 使用场景
用于非主键自增列

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.