Подтвердить что ты не робот

Можете ли вы сообщить AutoMapper о глобальном игнорировании отсутствующих свойств при сопоставлении?

У меня довольно много сущностей, и до сих пор я делал такие вещи, как

Mapper.CreateMap<Employee, EmployeeDetailsDTO>()
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore());

Я хочу сказать AutoMapper просто игнорировать недостающие свойства в целевом объекте без указания каждого из них. До сих пор я не нашел способ сделать это с помощью нескольких поисков SO и Google. У кого-нибудь есть решение? Я готов сделать какой-то цикл или что угодно, если он может быть написан один раз и что он будет масштабироваться с изменениями модели /dto или добавленными свойствами.

4b9b3361

Ответ 1

Когда вы получаете сообщение об ошибке? Это когда вы вызываете AssertConfigurationIsValid?

Если да, то просто не вызывайте этот метод

Вам не нужно вызывать этот метод, рассмотрите следующее отображение, которое работает:

public class Foo1
{
    public string Field1 { get; set; }
}
public class Foo2
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
}

Mapper.CreateMap<Foo1, Foo2>();
var foo1 = new Foo1() {Field1 = "field1"};
var foo2 = new Foo2();
Mapper.Map(foo1, foo2);//maps correctly, no Exception

Вы можете вызвать AssertConfigurationIsValid для других сопоставлений, чтобы убедиться, что они верны, поэтому вместо этого вам необходимо упорядочить ваши сопоставления в профилях:

public class MyMappedClassesProfile: Profile
{
    protected override void Configure()
    {
        CreateMap<Foo1, Foo2>();
        //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap
        //I made this mistake when migrating 'static' mappings to a Profile.    
    }
}

Mapper.AddProfile<MyMappedClassesProfile>();

а затем, если вы решите, что хотите проверить правильность сопоставления (в каждом случае в вашей ситуации), вызовите

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName);

важно в вашем случае и/или в любом случае, когда вы не вызываете AssertConfigurationIsValid, вы должны использовать что-то вроде AutoFixture и Unit Test, чтобы обеспечить правильное отображение. (который является намерением AssertConfigurationIsValid)

Ответ 2

Предлагается в wal answer "не вызывать AssertConfigurationIsValid()" небезопасно, так как это спрячет потенциальные ошибки в сопоставлениях.
Лучше явно игнорировать сопоставление между классами, для которых вы уверены, что все необходимые свойства уже правильно сопоставлены. Вы можете использовать расширения, созданные в AutoMapper: "Игнорировать остальные" , answer.? answer:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Src, Dest>();
     cfg.IgnoreUnmapped<Src, Dest>();  // Ignores unmapped properties on specific map
});

Метод cfg.IgnoreUnmapped игнорирует неизбранные свойства на всех картах и ​​не рекомендуется, поскольку он также скрывает любые потенциальные проблемы для всех классов.