dotnetcore / dotnetcore/FreeSql
在使用 FreeSql + FreeSql.ClickHouse 进行 批量插入(Insert / InsertOrUpdate / ExecuteAffrows) 时,框架内部获取字段名的逻辑使用的是 C# 属性名(CsName),而不是 Column 特性中配置的 Name。
- Dominant language
- C#
- Stars
- 4.4k
- Forks
- 910
- PR merge metrics
- No merged PRs in 30d
Description
#### 问题描述及重现代码:
在使用 FreeSql + FreeSql.ClickHouse 进行 批量插入(Insert / InsertOrUpdate / ExecuteAffrows) 时,框架内部获取字段名的逻辑使用的是 C# 属性名(CsName),而不是 Column 特性中配置的 Name。
这会导致以下问题:
当 C# 属性名 ≠ ClickHouse 实际列名 时
批量插入生成的 SQL 使用了错误的列名
ClickHouse 抛出 Unknown expression identifier 异常
源代码路径
https://github.com/dotnetcore/FreeSql/blob/70e5b946d2a43f10698bc846e6fea1e8a24440e7/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs#L37
Line:188
```c#
var columns = new string[_table.ColumnsByPosition.Length];
for (var i = 0; i < columns.Length; i++)
{
columns[i] = _table.ColumnsByPosition[i].CsName;
}
```
``` c#
[Table(Name = "test_table")]
public class TestEntity
{
[Column(Name = "timestamp")]
public DateTime Timestamp { get; set; }
[Column(Name = "task_name")]
public string TaskName { get; set; }
}
var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.ClickHouse,
"Host=127.0.0.1;Port=8123;Database=default;Username=default;Password=")
.Build();
var list = new List
{
new TestEntity
{
Timestamp = DateTime.Now,
TaskName = "test"
}
};
fsql.Insert(list).ExecuteAffrows();
```
#### 数据库版本
clickhouse/clickhouse-server: 25.8.6-alpine
#### 安装的Nuget包
FreeSql 3.5.304
FreeSql.ClickHouse 3.5.304
#### .net framework/. net core? 及具体版本
.NET 8.0
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.