dotnetcore / dotnetcore/FreeSql

在使用 FreeSql + FreeSql.ClickHouse 进行 批量插入(Insert / InsertOrUpdate / ExecuteAffrows) 时,框架内部获取字段名的逻辑使用的是 C# 属性名(CsName),而不是 Column 特性中配置的 Name。

Open
#2,172 4 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

#### 问题描述及重现代码:
在使用 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
{

Image

[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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.