сопоставить nullable int с nullable int + automapper

Мне нужно сопоставить обнуляемый int с обнуляемым int через autompper

Это мой инцидент в классе:

public class Incident : Evenement
{
    public Incident()
        : base(-1, Global.EvenementType.Incidents, DateTime.MinValue)
    {
    }

    public Incident(int id, DateTime date, string libelle,  int formulaireId,  string societe, string userName)
        : base(id, (int)Global.EvenementType.Incidents, date, libelle, "", "", societe)
    {
        ContratId = formulaireId;
        Contrat = null;
        UserName = userName;
    }

    public Incident(int id, DateTime date, string libelle, string societe, string userName)
        : base(id, (int)Global.EvenementType.Incidents, date, libelle, "", "", societe)
    {
        ContratId = null;
        Contrat = null;
        UserName = userName;
    }


    [DataMember]
    public int? ContratId { get; set; }

    [DataMember]
    public Contrat Contrat { get; set; }

    [DataMember]
    public string UserName { get; set; }

    [DataMember]
    public bool IsGeneral

и это мой класс ИНЦИДЕНТ

 public partial class INCIDENT : EVENEMENT
    {
        public Nullable<int> FORMULAIRE_ID { get; set; }
        public virtual FORMULAIRE FORMULAIRE { get; set; }
        public string USERNAME { get; set; }
    }

Когда я делаю сопоставление, и у меня есть ноль в contratId dans инцидент, он автоматически преобразуется в 0 в FORMULAIRE_ID в классе ИНЦИДЕНТ

Это мои привязки

    Mapper.CreateMap<Incident, INCIDENT>()
            .ForMember(degivreuse => degivreuse.FORMULAIRE_ID, expression => expression.MapFrom(degivreuse => degivreuse.ContratId))
              .ForMember(degivreuse => degivreuse.FORMULAIRE, expression => expression.Ignore());

А в ПД проблема: введите здесь описание изображения

У вас есть идеи, почему я не получаю нулевое значение, пожалуйста?

С уважением


person user1428798    schedule 22.10.2015    source источник
comment
Ваш код должен успешно сопоставить null с null. Я бы начал с проверки всех операций записи FORMULAIRE_ID. Возможно, его значение изменилось после сопоставления свойств (в другом установщике свойств или в чем-то еще?).   -  person Ilya Chumakov    schedule 23.10.2015
comment
нет все равно не меняется!!!   -  person user1428798    schedule 23.10.2015


Ответы (2)


Я не вижу никаких проблем с тем, как Automapper обрабатывает int?. Вот быстрый пример, который отлично работает:

public class Src1
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

public class Dest1
{
    public string Name { get; set; }
    public Nullable<int> Age { get; set; }
}

Mapper.CreateMap<Src1, Dest1>();
Mapper.AssertConfigurationIsValid();

var s = new Src1 {Name = "aaa", Age = null};
var d = Mapper.Map<Src1, Dest1>(s);

В приведенном выше примере d.Age равно null. Можете ли вы предоставить пример кода, который воспроизводит проблему, которую вы видите?

person PatrickSteele    schedule 23.10.2015

Сегодня я наткнулся на ту же проблему с AutoMapper 10.1.1. Я попытался сопоставить свой собственный класс с классом MarginSettings в библиотеке DinkToPdf. Класс MarginSettings имел 2 конструктора:

    public class MarginSettings
    {
        public Unit Unit { get; set; }

        public double? Top { get; set; }

        public double? Bottom { get; set; }

        public double? Left { get; set; }

        public double? Right { get; set; }

        public MarginSettings()
        {
            Unit = Unit.Millimeters;
        }

        public MarginSettings(double top, double right, double bottom, double left) : this()
        {
            Top = top;

            Bottom = bottom;

            Left = left;

            Right = right;
        }

        // the rest of class..
}

Похоже, что по какой-то причине AutoMapper вызывает конструктор с параметрами в классе MarginSettings, когда пытается сопоставить с ним мой пользовательский класс. Таким образом, значение по умолчанию double (0) устанавливается для double? свойств в этом конструкторе.

Вот код, демонстрирующий эту проблему:

    class SourceClass
    {
        public double? Top { get; set; }

        public double? Bottom { get; set; }

        public double? Left { get; set; }

        public double? Right { get; set; }
    }

    class ClassWithoutCtor
    {
        public double? Top { get; set; }

        public double? Bottom { get; set; }

        public double? Left { get; set; }

        public double? Right { get; set; }
    }

    // The class similar to one in DinkToPdf library
    class ClassWithCtor
    {
        public string Message1 { get; set; }
        public string Message2 { get; set; }

        public double? Top { get; set; }

        public double? Bottom { get; set; }

        public double? Left { get; set; }

        public double? Right { get; set; }

        public ClassWithCtor() => this.Message1 = "in default ctor";

        public ClassWithCtor(double top, double right, double bottom, double left)
            : this()
        {
            this.Top = new double?(top);
            this.Bottom = new double?(bottom);
            this.Left = new double?(left);
            this.Right = new double?(right);
            Message2 = "in ctor with parameters";
        }
    }

    class AutoMapperTest
    {
        public void TryMapZeros()
        {
            var source = new SourceClass
            {
                Top = 5,
                Bottom = 5
            };

            var mapConfiguration = new MapperConfiguration(
                cfg =>
                {
                    cfg.CreateMap<SourceClass, ClassWithoutCtor>();
                    cfg.CreateMap<SourceClass, ClassWithCtor>();
                }
                );

            var mapper = mapConfiguration.CreateMapper();
            var margin1 = mapper.Map<SourceClass, ClassWithoutCtor>(source);
            var margin2 = mapper.Map<SourceClass, ClassWithCtor>(source);
        }
    }

Сопоставленные объекты выглядят так после выполнения кода:

margin1
{PdfGeneratorTest.ClassWithoutCtor}
    Bottom: 5
    Left: null
    Right: null
    Top: 5
margin2
{PdfGeneratorTest.ClassWithCtor}
    Bottom: 5
    Left: 0
    Message1: "in default ctor"
    Message2: "in ctor with parameters"
    Right: 0
    Top: 5
person SvjMan    schedule 13.03.2021