Отображение нулевых значений приводит к значениям типов по умолчанию (Automapper ADO.NET) - PullRequest
0 голосов
/ 09 октября 2018

Недавно я добавил AutoMapper (7.0.1) в нашем бэкэнде, который, кстати, не использует ORM, просто ADO.NET.

Поэтому я создал профили отображениядля наших моделей, подобных этой:

public class UserMapping:Profile
{
    public UserMapping()
    {
        var mappingExpression = CreateMap<DataRow, User>();
        mappingExpression.ForMember(d => d.Id, o => o.MapFrom(s => s["Id"]));
        mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"]));
        mappingExpression.ForMember(d => d.Team, o => o.MapFrom(s => s["Team"]));
        mappingExpression.ForMember(d => d.LoginId, o => o.MapFrom(s => s["LoginID"]));
        mappingExpression.ForMember(d => d.FirstName, o => o.MapFrom(s => s["FirstName"]));
        mappingExpression.ForMember(d => d.LastName, o => o.MapFrom(s => s["LastName"]));
        mappingExpression.ForMember(d => d.Email, o => o.MapFrom(s => s["Email"]));
        mappingExpression.ForMember(d => d.Active, o => o.MapFrom(s => s["Active"]));
        mappingExpression.ForMember(d => d.Date, o => o.MapFrom(s => s["Date"]));
        mappingExpression.ForMember(d => d.Entity, o => o.MapFrom(s => s["Entity"]));
    }
}

и служебный класс, который просто инициализирует маппер.

 public static class Mapping
{
    public static void Configure()
    {

        Mapper.Initialize(cfg =>
        {
              cfg.AddProfile<UserMapping>();
                 //other profiles

            cfg.AllowNullCollections = true;
            cfg.AllowNullDestinationValues = true;
        });
    }


}

У меня есть проблемы:

  • каждое строковое свойство, даже если оно равно нулю в базе данных, возвращается как пустая строка после сопоставления

  • Timespan?возвращается как 00:00:00, если оно равно нулю в базе данных

  • bool?возвращается как ложное

Из-за того, что способ разработки внешнего интерфейса требует нулевых значений, мне не нужно игнорировать нулевые значения.

Я обнаружил, что Iможно использовать

 cfg.AllowNullCollections = true;
 cfg.AllowNullDestinationValues = true;

, но, к сожалению, процесс отображения по-прежнему не возвращает нулевые значения.Почему это так?

Спасибо

1 Ответ

0 голосов
/ 10 октября 2018

После нескольких часов поиска я нашел обходной путь.

Так, например, для свойств, которые меня интересуют, я изменил выражение отображения с

mappingExpression.ForMember(m => m.CutOffTime, s => s.MapFrom(o => o["CutOffTime"]));

на

 mappingExpression.ForMember(m => m.CutOffTime, s => s.MapFrom(o => o["CutOffTime"] ==  DBNull.Value ? null : o["CutOffTime"] ));

Теперь API возвращает нулевые значения, как и должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...