У меня есть две сущности
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
не отображается