Dapper和PostgreSQL复合类型的问题

时间:2017-08-09 21:47:46

标签: c# postgresql dapper npgsql

我在使用Npgsql 3.2.5和PostgreSQL 9.6.2的Dotnet Core 1.1 SDK上遇到了Dapper 1.5.2的问题,该问题与复合类型中的字段名称到POCO类中的字段名称的映射有关。在解析复合类型时,似乎Dapper没有使用NpgsqlSnakeCaseNameTranslator。

这是预期的行为吗?我是否正在使用Dapper跳过配置步骤?

如果没有,我认为这是一个错误。

重现的步骤:

鉴于Postgres表定义

CREATE TYPE row_metadata AS
(
    is_deleted boolean,
    create_time timestamp with time zone,
    created_by uuid,
    extra jsonb
);

CREATE TABLE groups
(
    id uuid not null
        constraint group_pkey
            primary key,
    row_metadata row_metadata,
    name text,
    notes text,
    parent_full_id text,
    parent_full_name text
);

以下POCO

public class RowMetadataOld
{
    public bool? IsDeleted { get; set; }
    public DateTimeOffset? CreateTime { get; set; }
    public Guid? CreatedBy { get; set; }
    public string Extra { get; set; }
}

public class Groups 
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public string ParentFullId { get; set; }
    public string ParentFullName { get; set; }
    public RowMetadata RowMetadata { get; set; }
}

// register the composite types with the postgres client
NpgsqlConnection.MapCompositeGlobally<RowMetadata>();

如果我使用强类型查询

var query1 = conn.Query("SELECT * FROM groups");

结果集中的典型行如下所示

{
    Id = "c182d54c-74eb-45cb-99b6-0c3cc0f11f16",
    RowMetadata = null,
    Name =  "test2",
    Notes = "notes2"
    ParentFullId = null,
    ParentFullName = null
}

请注意,RowMetadata中的数据为空。

如果我使用匿名类型查询

var query2 = conn.Query("SELECT * FROM groups");

同样的记录现在看起来像这样

{
    Id = "c182d54c-74eb-45cb-99b6-0c3cc0f11f16",
    RowMetadata = [ is_deleted: True, create_time: null, created_by: null, extra: {"hello": "world"}]
    Name =  "test2",
    Notes = "notes2"
    ParentFullId = null,
    ParentFullName = null
}

请注意,RowMetadata字段已填充,但字段名称尚未转换为C#约定。

如果将POCO转换为使用符合PostgreSQL标识符命名约定(lower_case_with_underscore)的属性名称,则会正确填充强类型查询。

0 个答案:

没有答案