我在我的Web项目(.NET Core3.1)中使用了Dapper,我试图将一条记录插入数据库( Server 2017) +返回创建的id。
我有这个东西..。
public class CreateDetailGroupDto
{
public string Name { get; set; }
public List<CreateDetailDto> Details { get; set; }
}负责任的方法是这样的:
public async Task<int> Create(CreateDetailGroupDto detailGroup)
{
using var cnn = Connection;
var parameter = new DynamicParameters();
parameter.Add("detailGroup", detailGroup);
parameter.Add("id", dbType: DbType.Int32, direction: ParameterDirection.Output);
await cnn.ExecuteAsync("spDetailGroup_Insert", param: parameter, commandType: CommandType.StoredProcedure);
int id = parameter.Get<int>("id");
return id;
}我正在执行存储过程spDetailGroup_Insert,它期望上面的对象是JSON格式的NVARCHAR(MAX),并将id作为输出参数。
我编写了一个处理程序,它应该在用作参数时序列化一个对象(我认为):
public class TypeHandler<T> : SqlMapper.TypeHandler<T>
{
public override T Parse(object value)
{
return JsonConvert.DeserializeObject<T>(value.ToString());
}
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.Value = JsonConvert.SerializeObject(value);
}
}在类的构造函数中,我使用SqlMapper.AddTypeHandler(new TypeHandler<CreateDetailGroupDto>());为DTO添加TypeHandler。然而..。运行Create方法时,即使成功地执行了Handler中的SetValue方法,对象也不会转换为JSON。
我知道这很具体,但是有人知道这里会发生什么吗?
编辑:
在SetValue方法中添加一行来指定DbType似乎解决了以下问题:
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.DbType = DbType.String;
parameter.Value = JsonConvert.SerializeObject(value);
}发布于 2020-07-14 15:17:29
基于DynamicParameters的实现,DbType默认为null,因此我猜您在Add-方法中遗漏了DbType规范:
public async Task<int> Create(CreateDetailGroupDto detailGroup)
{
using var cnn = Connection;
var parameter = new DynamicParameters();
parameter.Add("detailGroup", detailGroup, DbType.String);
parameter.Add("id", dbType: DbType.Int32, direction: ParameterDirection.Output);
await cnn.ExecuteAsync("spDetailGroup_Insert", param: parameter, commandType: CommandType.StoredProcedure);
int id = parameter.Get<int>("id");
return id;
}nvarchar(max)的正确映射应该是DbType.String (根据这个文档 )。
https://stackoverflow.com/questions/62897424
复制相似问题