Dapper 是否需要类型映射器来处理以下场景。
假设数据库 (Postgres) 有一个 JSONB 格式的列:
Events
,在 C# 中是 List<Event>
和 Event
,简单如下:
public sealed class Event
{
public string Test { get; set; } = string.Empty;
}
如果我向 Dapper 添加通用 JSON 映射器,如下所示:
SqlMapper.AddTypeHandler(new JsonMapper<Event>());
使用以下代码与映射器本身:
public class JsonMapper<T> : SqlMapper.TypeHandler<T> where T : class, new()
{
public override T Parse(object? value)
{
var config = new T();
if (value is not null)
{
var stringValue = value.ToString() ?? string.Empty;
config = JsonConvert.DeserializeObject<T>(stringValue, NewtonsoftJsonSerializerSettings);
}
return config ?? new();
}
public override void SetValue(IDbDataParameter parameter, T? value)
{
parameter.Value = JsonConvert.SerializeObject(value, NewtonsoftJsonSerializerSettings);
}
private static JsonSerializerSettings NewtonsoftJsonSerializerSettings = new()
{
TypeNameHandling = TypeNameHandling.All,
NullValueHandling = NullValueHandling.Ignore,
Formatting = Formatting.Indented,
ObjectCreationHandling = ObjectCreationHandling.Replace,
// Don't care about these, not relevant for the question
//Converters = new List<JsonConverter> { new IsoDateTimeConverter(), new IpAddressConverter(), new IpEndpointConverter() }
};
}
我还需要添加
SqlMapper.AddTypeHandler(new JsonMapper<List<Event>>());
还是 Dapper 是否以某种方式隐式地得到了这个?
我现在已经对此进行了测试:您确实必须为要显式映射的所有类型添加所有类型处理程序。因此,在我的示例中,您需要
SqlMapper.AddTypeHandler(new JsonMapper<Event>());
以及 SqlMapper.AddTypeHandler(new JsonMapper<List<Event>>());
。