我在使用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)的属性名称,则会正确填充强类型查询。