Сопоставить свойство со свойством автомата коллекции - PullRequest
2 голосов
/ 27 января 2020

У меня есть две сущности

public class A{
    public string Example { get; set; }
    public ICollection<B> BCollection { get;set; } = new HashSet<B>();
}

public class B {
    public string MyProperty { get; set; }
}

И простая ViewModel

public class AFirstLoadViewModel {
    public string Example { get; set; }
    public string MyProperty { get; set; }
}

Дело в том, что эта модель будет использоваться только при первом вводе данных, когда A будет иметь только один B объект внутри.

Итак, я пытаюсь сопоставить объект следующим образом:

var source = new AFirstLoadViewModel
{
    Example = "example",
    MyProperty = "myproperty"
}

этому

var destination = new A {
    Example = "example"
    BCollection = new List<B> {
        new B { MyProperty = "myproperty" }
    }
}

I попробуйте сделать трюк, используя ForPath и BeforeMap без удачи

CreateMap<AFirstLoadViewModel, A>()
    .ForMember(x => x.Example, c => c.MapFrom(x => x.Example))
    .ForPath(x => x.BCollection.First().MyProperty, c => c.MapFrom(x => x.MyProperty))
    .BeforeMap((viewModel, entity) => {
        if(!entity.BCollection.Any())
            BCollection.Add(new B());
    });

Но я получаю

System.ArgumentOutOfRangeException: разрешен только доступ членов.

Как я могу с этим справиться?

Я уточняю: у модели представления и модели гораздо больше свойств, классы вопросов приведены в качестве примера

Редактировать:


Я пробую решение, предложенное Джонатаном, и оно работает, проблема в том, что я больше не могу юнит-тестирование.

Я тестирую с

var config = new MapperConfiguration(cfg => cfg.CreateMap<AFirstLoadViewModel, A>(MemberList.Source));

И когда я вызываю config.AssertConfigurationIsValid(), происходит сбой, потому что свойство MyProperty не отображается

Ответы [ 2 ]

1 голос
/ 27 января 2020

Проблема в том, что вы пытаетесь сопоставить .First (). Первый еще не существует, потому что запрос находится на нулевой / пустой коллекции. Вы не можете назначить элемент .First () в коллекции, если он еще не существует. Вместо этого просто сопоставьте как коллекцию напрямую.

CreateMap<AFirstLoadViewModel, A>()
.ForMember(x => x.Example, c => c.MapFrom(x => x.Example))
.ForMember(x => x.BCollection, c => c.MapFrom(x => new [] { new B { MyProperty = x.MyProperty } }));
1 голос
/ 27 января 2020
CreateMap<AFirstLoadViewModel, A>()
    .ForMember(x => x.Example, c => c.MapFrom(x => x.Example))
    .ForMember(x => x.BCollection, c => c.MapFrom(x => new [] { new B { MyProperty = x.MyProperty } })); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...