AutoMapper игнорирует метод расширения - PullRequest
0 голосов
/ 18 мая 2019

У меня есть 2 модели:

User.cs:

  • Имя
  • Фамилия
  • E-mail
  • Пароль

Authentication.cs

  • E-mail
  • Пароль

Мне бы хотелось, чтобы адрес электронной почты и пароль из модели аутентификации отображались на адрес электронной почты и пароль в модели пользователя, поэтому в моем MappingProfile у меня есть:

public UserProfile()
    {
        CreateMap<User, Authentication>()
            .ForMember(dest => dest.Email, o => o.MapFrom(src => src.Email))
            .ForMember(dest => dest.Password, o => o.MapFrom(src => src.Password))
            .IgnoreAllNonExisting();
    }

IgnoreAllNonExisting является пользовательским расширением, например:

   public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
        (this IMappingExpression<TSource, TDestination> expression)
    {
        var flags = BindingFlags.Public | BindingFlags.Instance;
        var sourceType = typeof(TSource);
        var destinationProperties = typeof(TDestination).GetProperties(flags);

        foreach (var property in destinationProperties)
        {
            if (sourceType.GetProperty(property.Name, flags) == null)
            {
                expression.ForMember(property.Name, opt => opt.Ignore());
            }
        }
        return expression;
    }

Несмотря на расширение, я все еще получаю эту ошибку:

Несопоставленные свойства: Имя; Фамилия

Это почти как если бы мое расширение просто игнорировалось?

Кто-нибудь знает, что я делаю не так?

1 Ответ

0 голосов
/ 18 мая 2019

Необходимо создать сопоставления от Пользователь до Аутентификация и наоборот (не одно сопоставление для обоих направлений).

Поскольку имена свойств являютсяТо же самое для Пользователь и Аутентификация AutoMapper выполняет автоматическое сопоставление.

Метод расширения IgnoreAllNonExisting не требуется, AutoMapper делает эту работу дляВы.

public static void Test01()
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, Authentication>();
        cfg.CreateMap<Authentication, User>();
    });

    var mapper = config.CreateMapper();

    var authentication = mapper.Map<User, Authentication>(new User { Email = "email", Password = "pass", Firstname = "first", Lastname = "last" });

    var user = mapper.Map<Authentication, User>(new Authentication { Email = "email", Password = "pass" });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...