gpt4 book ai didi

c# - 带有 DynamicParameters 的 Dapper 自定义 TypeHandler

转载 作者:行者123 更新时间:2023-12-04 15:23:03 29 4
gpt4 key购买 nike

我在我的 Web-API 项目 (.NET Core 3.1) 中使用 Dapper,我正在尝试将记录插入数据库 (SQL 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方法运行时,对象未转换为 JSON,即使 SetValue Handler 中的方法已成功执行。

我知道这很具体,但有没有人知道这里可能发生了什么?

编辑:
似乎在 SetValue 方法中添加一行以指定 DbType,似乎可以解决问题:

public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.DbType = DbType.String;
parameter.Value = JsonConvert.SerializeObject(value);
}

最佳答案

基于implementation of DynamicParameters DbType 默认为 null,所以我猜你在添加方法中缺少 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 according to this documentation .

关于c# - 带有 DynamicParameters 的 Dapper 自定义 TypeHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62897424/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com