如果模型本身(例如 T)已知,Dapper for Postgres(在 C# 中)是否需要类型映射器将 List<T> 映射到 JSONB?

问题描述 投票:0回答:1

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 是否以某种方式隐式地得到了这个?

c# dapper jsonb
1个回答
0
投票

我现在已经对此进行了测试:您确实必须为要显式映射的所有类型添加所有类型处理程序。因此,在我的示例中,您需要

SqlMapper.AddTypeHandler(new JsonMapper<Event>());
以及
SqlMapper.AddTypeHandler(new JsonMapper<List<Event>>());

© www.soinside.com 2019 - 2024. All rights reserved.