首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用Dapper自定义SqlMapper.TypeHandler分析方法

未调用Dapper自定义SqlMapper.TypeHandler分析方法
EN

Stack Overflow用户
提问于 2019-01-21 22:55:09
回答 1查看 3.7K关注 0票数 8

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

代码语言:javascript
复制
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; }
}

当我连接到DB并调用存储过程时,CustomerTypeHandler解析方法永远不会被调用,并且我的CreditAccount对象只用AccountId填充。Customer对象为空。

我将其命名为:

代码语言:javascript
复制
    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

Dapper 1.50.5

代码非常简单。我没有得到异常。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-12-26 18:19:36

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

代码语言:javascript
复制
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());
        }
    }

使用这个类的例子-所有的工作都很好。

代码语言:javascript
复制
        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);
                }
            }

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

https://stackoverflow.com/questions/54292529

复制
相关文章

相似问题

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