通过 Dapper 中的类型处理程序将自定义对象映射到多列

Mapping a custom object to multiple columns by type handler in Dapper

我遇到的问题已在此处多次讨论,但不幸的是 none 的答案或提示对我有用。

我想使用不同的自定义类型(例如金钱或记录链接)。

在数据库中,我会将这些自定义类型的不同属性存储到多个列中(货币示例:YearlyIncome.Amount、YearlyIncome.CurrencyCode)。

我发现的所有提示都尝试在查询中使用 "spliton" 来解决问题。 但我更喜欢使用类型处理程序的解决方案,这样我就不必手动将它添加到每个查询中。

我已经尝试使用属性之间的一种分隔符将信息存储在单个数据库列中。这基本上可以使用自定义类型处理程序正常工作 - 但最后的数据库看起来 "ugly".

public class Recordlink
{
    public Guid Id { get; set; }
    public string Type { get; set; }
    public string Name { get; set; }
    ...
}

public class Money
{
    public decimal Amount { get; set; }
    public string CurrencyCode { get; set; }
    ...
}

public class Contact
{
    Guid Id {get;set;}
    Money YearlyIncome {get;set;}
    Recordlink Company {get;set;}
}

我想在查询联系人列表时实现这一点,例如,我将能够访问 属性 contacts[0].Company.Id(当然有之前的 NULL 检查).

由于类似问题有这么多不同的提示和答案,我不确定这是否可行。

但即使这不可能像我想的那样 - 我宁愿知道这一点而不是寻找解决方案的年龄。

感谢和问候

马库斯

据我所知,您不能按照此处概述的方式执行此操作。

标准的自定义类型处理程序如下所示:

public class MyTypeHandler : SqlMapper.TypeHandler<MyType>
{
    public override MyType Parse(object value)
    {
        return ...;
    }

    public override void SetValue(System.Data.IDbDataParameter parameter, MyType value)
    {
        parameter.Value = ...;
    }
}

因此,Parse 方法将结果行中的一项映射到您的自定义类型。 SetValue 方法将自定义类型的一个实例映射到一个数据库参数。将结果行的多个项目映射到一个对象不是可能性的一部分。

在您看来,我不会发明自己的 属性 表示,而是将 Money 序列化为 JSON 并将其保存在 table 的一列中。您可以为此制作自定义处理程序。

可能看起来像这样:

public class MoneyTypeHandler : SqlMapper.TypeHandler<Money>
{
    public override Money Parse(Type destinationType, object value)
    {
        return JsonConvert.DeserializeObject(value.ToString(), destinationType);
    }

    public override void SetValue(IDbDataParameter parameter, Money value)
    {
        parameter.Value = (value == null) ? (object)DBNull.Value : JsonConvert.SerializeObject(value);
        parameter.DbType = DbType.String;
    }
}