Dapper не сохраняет значения, возвращаемые базой данных, в некоторых свойствах - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь настроить Dapper для извлечения данных из базы данных MySQL в мою модель в приложении C#. Три столбца результатов запроса относятся к типу JSON (это: toaddress, ccaddress, params). Ниже вы можете увидеть результаты запроса.

query results

Моя модель:

namespace LegacyWorkDataAccess.Models
{
    public class AdvancedNotificationOfArrivalSent
    {
        public int ID { get; set; }
        public string NotificationType { get; set; }
        public string HBL { get; set; }
        public bool Sent { get; set; }
        public DateTime When { get; set; } = new DateTime();
        public List<string> ToAddresses { get; set; } = new List<string>();
        public List<string> CcAddresses { get; set; } = new List<string>();
        public EmailParams Params { get; set; } = new EmailParams();

        public string EntryOverview
        {
            get { return $"{ID}: {HBL}, sent ({Sent}) on {When}"; }
        }
    }
}

Моя mapper:

namespace LegacyWorkDataAccess.Mappers
{
    internal class AdvancedNotificationOfArrivalSentMap : EntityMap<Models.AdvancedNotificationOfArrivalSent>
    {
        public AdvancedNotificationOfArrivalSentMap()
        {
            SqlMapper.AddTypeHandler(typeof(Models.EmailParams), new Handlers.JsonParamsHandler());
            SqlMapper.AddTypeHandler(typeof(List<string>), new Handlers.JsonEmailsHandler());

            Map(x => x.ID).ToColumn("id");
            Map(x => x.NotificationType).ToColumn("notificationtype");
            Map(x => x.HBL).ToColumn("hbl");
            Map(x => x.Sent).ToColumn("sent");
            Map(x => x.When).ToColumn("when");
            Map(x => x.ToAddresses).ToColumn("toaddress");
            Map(x => x.CcAddresses).ToColumn("ccaddress");
            Map(x => x.Params).ToColumn("params");
        }
    }
}

Электронная почта JSON обработчик

namespace LegacyWorkDataAccess.Handlers
{
    public class JsonEmailsHandler : SqlMapper.ITypeHandler
    {
        public void SetValue(IDbDataParameter parameter, object value)
        {
            parameter.Value = JsonConvert.SerializeObject(value);
        }

        public object Parse(Type destinationType, object value)
        {
            var emailsJson = (string)value;
            var output = JsonConvert.DeserializeObject<List<string>>(emailsJson);

            return output;
        }
    }
}

Как я пытаюсь получить данные из базы данных

using (var db = new MySqlConnection(ConnectionString))
{
    FluentMapper.EntityMaps.TryAdd(typeof(Mappers.AdvancedNotificationOfArrivalSentMap), new Mappers.AdvancedNotificationOfArrivalSentMap());
    List<Models.AdvancedNotificationOfArrivalSent> output = db.Query<Models.AdvancedNotificationOfArrivalSent>($"CALL getfclsentbydaterange(\"{dateStart}\", \"{dateEnd}\");").ToList();

    return output;
}

Данные, которые фактически доступны в модели:

model content

Свойство Params заполняется правильно со всеми данными, но ToAddresses и CcAddresses пустые. Я добавил несколько точек останова внутри обработчика Email JSON, и похоже, что обработчик никогда не запускается (в то время как обработчик параметров запускается без проблем), поэтому держу пари, что моя проблема находится в классе Mapper, однако я не могу понять, что Я поступил неправильно. Буду признателен за каждое предложение, заранее спасибо.

...