Dapper、Postgres 和 camelcase

Dapper, Postgres and camelcase

我正在尝试将 Dapper 与 Postgres 结合使用,但我一直无法使列映射正常工作。 我对数据库中的列使用 camel_casing。

这是我正在使用的table:

create table test_table
(
    id uuid default gen_random_uuid() not null
        constraint test_table_pk
            primary key,
    first_name varchar(256) not null,
    created_date timestamp not null
);

alter table test_table owner to root;

我已提出以下申请来重现问题

namespace DapperIssue {
    class Program {
        static void Main(string[] args) {
            NpgsqlConnection.GlobalTypeMapper.UseNodaTime();
            DefaultTypeMap.MatchNamesWithUnderscores = true;
            
            using (var conn =
                new NpgsqlConnection("CONNECTIONSTRING FOR DATABASE")) {
                
                conn.Open();
                var result = conn.Query<T1>(@"
SELECT id, first_name FROM test_table", new { });

                var result2 = conn.Query<T2>(@"
SELECT id, first_name, created_date FROM test_table", new { });
            }
        }
    }

    //public record T1(Guid Id, string FirstName) { }
    
    public class T1 {
        public Guid Id { get; }
        public string FirstName { get; }

        public T1(Guid id, string firstName) {
            Id = id;
            FirstName = firstName;
        }
    }

    public record T2(Guid Id, string FirstName, Instant CreateDate) {
    }
}

应用程序在尝试查询数据库时失败,出现以下错误:

System.InvalidOperationException:一个无参数的默认构造函数或一个匹配的签名(System.Guid id,System.String first_name)

我的理解是设置 DefaultTypeMap.MatchNamesWithUnderscores = true 应该可以完成这项工作。

使用 Dapper“2.0.78”和 NpgSql“5.0.3”

这似乎是 dapper 中的一个悬而未决的问题。阅读更多 DefaultTypeMap.MatchNamesWithUnderscores is ignored for ctor parameters and Added support for MatchNamesWithUnderscores and ctor parameters.

添加无参数构造函数应该可以解决您的问题。这些列应映射到具有命名设置的 class 的属性。