Мы сопоставляем иерархию доменов с иерархией Dto. Некоторые свойства базового класса домена сглаживаются. Мы используем ReverseMap, чтобы упростить отображение обратно в домен из dto.
Мы сопоставили Contended.Id do ContainId of Dto и проигнорировали путь для обратной карты. То, что мы ожидали, это отображение обратно на объект домена не должно создавать новые экземпляры для Contended-property. Но это было не так. После некоторых исследований мы выяснили, что это произошло из-за того, что не унаследовал .ForPath (, opt => opt.Ignore ()) для ReverseMap.
Мы используем версию 9.0.0 Automapper .
Вот код:
public class Contained {
public Guid Id { get; set; }
}
public class Base {
public Contained Contained { get; set;}
}
public class Derived: Base { }
public abstract class BaseDto {
public Guid? ContainedId { get; set; }
}
public class DerivedDto: BaseDto { }
[Test]
public void ForPathInheritanceWorks()
{
var configuration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Base, BaseDto>()
.IncludeAllDerived()
.ReverseMap()
.ForPath(d => d.Contained.Id, opt => opt.Ignore());
cfg.CreateMap<Derived, DerivedDto>()
.ReverseMap();
});
var mapper = configuration.CreateMapper();
var derived = mapper.Map<Derived>(new DerivedDto());
Assert.That(derived.Contained, Is.Null); // fails, because derived.Contained is not null.
}
Чтобы обойти проблему, нам пришлось добавить
.ForPath(d => d.Contained.Id, opt => opt.Ignore())
после ReverseMap производного класса.
Для меня это похоже на ошибку в Automapper.