簡體   English   中英

帶有 DynamicParameters 的 Dapper 自定義 TypeHandler

[英]Dapper custom TypeHandler with DynamicParameters

我在我的 Web-API 項目(.NET Core 3.1)中使用 Dapper,我正在嘗試將記錄插入數據庫(SQL Server 2017)+ 返回創建的 ID。

我有這個 object...

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 ,它期望上面的 object 采用 JSON 格式NVARCHAR(MAX)並且 ID 為 Z78E6221F6393D1356681DB398F14CEer6D 參數。

我寫了一個處理程序,它應該在用作參數時序列化 object(我想):

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);
    }
}

在 class 的構造函數中,我使用SqlMapper.AddTypeHandler(new TypeHandler<CreateDetailGroupDto>()); 為 DTO 添加 TypeHandler。 但是...當運行Create方法時,即使成功執行了 Handler 中的SetValue方法,object 也不會轉換為 JSON。

我知道這是非常具體的,但有人知道這里可能發生什么嗎?

編輯:
似乎在 SetValue 方法中添加一行來指定 DbType,似乎可以解決問題:

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

基於 DynamicParameters 的實現, DbType 默認為 null,所以我猜您在 Add-Method 中缺少 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM