. NET Автоматизатор ядра 3 не отображает различные переменные имени? Работал в рамках. NET - PullRequest
0 голосов
/ 20 июня 2020

Ниже представлен профиль автоматического картирования. Возникает ошибка в том, что адрес назначения Id имеет неправильный формат ввода.

Свойство назначения Id даже не отображается.

public class AspGetUserLoginReturnModelToSRSDLUserLoginModel : Profile
{
    public AspGetUserLoginReturnModelToSRSDLUserLoginModel()
    {
        CreateMap<asp_GetUserLoginReturnModel, SRSDLUserLoginModel>()
            .ForMember(dest => dest.UserPassword, opt => opt.MapFrom(src => src.PasswordHash))
            .ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.Id)              
            ;
    }
}

Теперь целевой класс SRSDLUserLoginModel является производным от базового класса, имеющего метод доступа publi c с именем Id, который является типом обнуляемого long.

Исходное свойство Id, используемое выше, имеет тип string.

Поскольку код, показанный выше, источник Id сопоставлен со свойством назначения UserId.

Но Automapper сопоставляет источник Id со свойством Id классов на основе назначения .

ПОЧЕМУ ЭТО ПРОИСХОДИТ?

Код прямолинейный, и нет ничего нового, что нужно сделать. Это Automapper, как и большинство других пакетов, с которыми я работаю?

В рамках full / classi c. NET пакеты работали нормально, но в. NET Core эти пакеты просто отстой?

// source class
public partial class asp_GetUserLoginReturnModel
{
    public string Id { get; set; }
}

// destination classes
public class SRSDLUserLoginModel: SRSDLModel, ISRSDLUserLoginModel
{  
    public string UserId { get; set; }
    public string UserPassword { get; set; }
    //  [...]
}

public class SRSDLModel : ISRSDLModel
{  
    public long? Id { get; set; }
    // [...]
}

1 Ответ

1 голос
/ 20 июня 2020

AutoMapper будет отображать свойства с одинаковыми именами по умолчанию, поэтому вам не нужно писать их все время. В этом случае он пытается установить свойство SRSDLModel.Id со значением из свойства asp_GetUserLoginReturnModel.Id. Как вы уже заметили, это не работает из-за несоответствия между long? и string.

Чтобы исправить это, используйте метод .Ignore() в вашем сопоставлении, чтобы указать, что это указывает c свойство не должно устанавливаться во время сопоставления. Конфигурация может выглядеть так:

.ForMember(dest => dest.Id, i => i.Ignore());
...