如何使用 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" 无论您正在与哪个数据库交谈,但您可能需要根据提供商稍微调整一下。
当我尝试反序列化包含由 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" 无论您正在与哪个数据库交谈,但您可能需要根据提供商稍微调整一下。