gpt4 book ai didi

未调用 Dapper 自定义 SqlMapper.TypeHandler Parse 方法

转载 作者:行者123 更新时间:2023-12-04 21:30:10 24 4
gpt4 key购买 nike

我创建了一个 SqlMapper.TypeHandler 来将一个 Customer 对象映射到一个 CreditAccount 类,如下所示:

public class CustomerTypeHandler : SqlMapper.TypeHandler<Customer>
{
public override Customer Parse(object value)
{
throw new NotImplementedException();
}
public override void SetValue(IDbDataParameter parameter, Customer
value)
{
throw new NotImplementedException();
}
}

public class CreditAccount
{
public int AccountId { get; set; }
public Customer Customer{ get; set; }
}

public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
}
当我连接到数据库并调用 sproc 时,从不调用 CustomerTypeHandler Parse 方法,并且我的 CreditAccount 对象仅填充了 AccountId。客户对象为空。
我这样称呼它:
    public async Task<CreditAccount> GetCreditAccount(int accountId)
{
var sql = "MY PROC NAME HERE";
var parameters = new DynamicParameters();
parameters.Add("@AccountId", accountId);

SqlMapper.AddTypeHandler(new CustomerTypeHandler());

using (IDbConnection connection = Connection)
{
connection.Open();
var account = await connection.QueryFirstAsync<CreditAccount>(sql, parameters, commandType: CommandType.StoredProcedure);
return account;
}
}
}
我在 Parse 方法中放置了一个断点,它从未被调用。
数据库连接有效,我得到了 AccountId。
我的环境;
.NET 核心 2.2
小巧玲珑 1.50.5
代码很简单。我没有异常(exception)。有任何想法吗?

最佳答案

一年过去了,现在在 Dapper 2.0.30 中没有这个错误。
我在 Postgres 的 jsonb 列上检查了它。

using Dapper;
using Newtonsoft.Json;
using Npgsql;
using System;
using System.Data;

public class CreditAccount
{
public int AccountId { get; set; }
public Customer Customer { get; set; }
}

public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
}

public class CustomerJsonObjectTypeHandler : SqlMapper.TypeHandler<Customer>
{
public override void SetValue(IDbDataParameter parameter, Customer value)
{
parameter.Value = (value == null)
? (object)DBNull.Value
: JsonConvert.SerializeObject(value);
parameter.DbType = DbType.String;
}

public override Customer Parse(object value)
{
return JsonConvert.DeserializeObject<Customer>(value.ToString());
}
}

使用此类的示例 - 一切正常。
        static void Main(string[] args)
{

using (var connection = GetDefaultConnection())
{
connection.Open();
var customer = new Customer
{
FirstName = "Gaday",
LastName = "Ivanova",
MiddleName = "Petrovich"
};
var jsonData = JsonConvert.SerializeObject(customer);
var strQuery = $"SELECT 10500 as AccountId,'{jsonData}'::jsonb as Customer";

SqlMapper.AddTypeHandler(new CustomerJsonObjectTypeHandler());

try
{
var data = connection.QueryFirst<CreditAccount>(strQuery);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}

}

关于未调用 Dapper 自定义 SqlMapper.TypeHandler Parse 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292529/

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