如何使用 Dapper 反序列化 DbString

How to deserialize DbString with Dapper

当我尝试反序列化包含由 DbString:

表示的字符串的记录时
class Record 
{
  public DbString Text {get; set;}
}

我收到错误

{"Invalid cast from 'System.String' to 'Dapper.DbString'."}

在这种情况下我是否滥用了 DbString?

Dapper 的想法是将查询结果转换为标准 .net classes。

"DbString" 类型是一个 Dapper class,用于以特定方式指定参数值,它不是 "standard .net"。

因此,与其尝试猜测 Dapper 可能希望将事物映射到什么类型,不如从最简单的情况开始,因为 Dapper 通常都能正常工作。

在你的情况下,你的记录应该只是

class Record 
{
    public string Text { get; set; }
}

Dapper 将做一些工作以确保处理任何合理的类型转换 - 例如,如果您的数据库字段是一个 int,那么它会很乐意将其映射到 C# 上的 int 属性键入 or 到长 or 到短或字节(虽然你 运行 在 [=29 溢出异常的风险=]time 如果向下转换为较小的数据类型)。总而言之,Dapper 对你很好,并尝试完成类型映射的艰苦工作——你通常可以坚持基础知识(字符串,而不是担心可能会使用 DbString),Dapper 会帮你解决问题![​​=11=]

如果您需要在读取模型中使用 DbString(如我的第一个回答的评论中所述),那么您可以选择包含从字符串到 DbString 的映射器 - 例如。定义 class

public class DbStringTypeHandler : SqlMapper.TypeHandler<DbString>
{
    public override DbString Parse(object value)
    {
        if (value == null)
            return null;
        var dbStringValue = value as DbString;
        if (dbStringValue != null)
            return dbStringValue;
        var stringValue = value as string;
        if (stringValue != null)
            return new DbString { Value = stringValue };
        throw new InvalidCastException("Invalid cast from '" + value.GetType() + "' to '" + typeof(DbString) + "'.");
    }

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

然后调用

SqlMapper.AddTypeHandler<DbString>(new DbStringTypeHandler());

在执行任何查询之前。

现在 "Record" class 作为读取模型和 "writing"(即设置参数)应该表现良好。

我用 SQL 服务器连接测试了这个,我 认为 你需要调用 "SqlMapper" class "AddTypeHandler" 无论您正在与哪个数据库交谈,但您可能需要根据提供商稍微调整一下。