首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DynamicParameters的Dapper自定义DynamicParameters

使用DynamicParameters的Dapper自定义DynamicParameters
EN

Stack Overflow用户
提问于 2020-07-14 14:26:07
回答 1查看 1.6K关注 0票数 3

我在我的Web项目(.NET Core3.1)中使用了Dapper,我试图将一条记录插入数据库( Server 2017) +返回创建的id。

我有这个东西..。

代码语言:javascript
复制
public class CreateDetailGroupDto
{
    public string Name { get; set; }

    public List<CreateDetailDto> Details { get; set; }
}

负责任的方法是这样的:

代码语言:javascript
复制
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作为输出参数。

我编写了一个处理程序,它应该在用作参数时序列化一个对象(我认为):

代码语言:javascript
复制
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似乎解决了以下问题:

代码语言:javascript
复制
public override void SetValue(IDbDataParameter parameter, T value)
{
    parameter.DbType = DbType.String;
    parameter.Value = JsonConvert.SerializeObject(value);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-14 15:17:29

基于DynamicParameters的实现,DbType默认为null,因此我猜您在Add-方法中遗漏了DbType规范:

代码语言:javascript
复制
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 (根据这个文档 )。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62897424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档