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

Automapper возвращает пустую коллекцию, я хочу null

public class Person
{
   Name { get; set; }
   IEnumerable<Address> Addresses { get; set; }
}

public class PersonModel
{
   Name { get; set; }
   IEnumerable<AddressModel> Addresses { get; set; }
}

Если я сопоставляю Person с PersonModel следующим образом:

Mapper.DynamicMap<Person, PersonModel>(person);

Если свойство Addresses в Person равно null, они отображаются в PersonModel как пустой Enumerable вместо нулевого.

Как получить PersonModel значение null Addresses вместо пустого Enumerable?

4b9b3361

Ответ 1

Таким образом, возможно, есть несколько способов сделать это с помощью Automapper, и это всего лишь одно:

Mapper.CreateMap<Person, PersonMap>()
   .AfterMap( (src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null );

Этот код использует новый оператор С# ?. для нулевой безопасности, поэтому вам может потребоваться удалить его и проверить значение null, если вы не можете использовать эту функцию в своем коде.

Ответ 2

Простым ответом является использование AllowNullCollections:

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.AllowNullCollections = true;
});

или если вы используете API-интерфейс экземпляра

new MapperConfiguration(cfg =>
{
    cfg.AllowNullCollections = true;
}

Ответ 3

Другой альтернативой этому является использование условия, поэтому только сопоставьте значение, когда значение не равно нулю. Это может потребовать, чтобы значение по умолчанию было равно null (поскольку оно не будет отображаться)

 Mapper.CreateMap<Person, PersonModel>()
.ForMember(
    dest => dest.Addresses,
    opt => opt => opt.Condition(source=> source.Addresses!= null));

Ответ 4

Вы должны иметь возможность определить настраиваемый преобразователь для свойства, для которого вы хотите, чтобы это поведение было выполнено. Так что-то вроде:

Mapper.CreateMap<Address, AddressModel>();
Mapper.CreateMap<Person, PersonModel>()
    .ForMember(
        dest => dest.Addresses,
        opt => opt.ResolveUsing(person => person.Addresses.Any() ? person.Addresses.Select(Mapper.Map<Address, AddressModel>) : null));

Ответ 5

В дополнение к настройке AllowNullCollections при инициализации конфигурации преобразователя (как отмечено в этом ответе), у вас есть возможность установить AllowNullCollections в определении Profile, например:

public class MyMapper : Profile
{
    public MyMapper()
    {
        // Null collections will be mapped to null collections instead of empty collections.
        AllowNullCollections = true;

        CreateMap<MySource, MyDestination>();
    }
}