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
にnullではなく空のEnumerable
としてマップされます。
空のPersonModel
ではなくAddresses
にnull Enumerable
を持たせるにはどうすればよいですか?
したがって、Automapperを使用してこれを実現する方法はおそらくいくつかあり、これは1つにすぎません。
Mapper.CreateMap<Person, PersonMap>()
.AfterMap( (src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null );
このコードはnullの安全性のために新しいc#?.
演算子を使用しているため、コードでその機能を使用できない場合は、それを削除してnullを確認する必要がある場合があります。
単純な答えはAllowNullCollections
を使用することです:
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.AllowNullCollections = true;
});
またはインスタンスAPIを使用する場合
new MapperConfiguration(cfg =>
{
cfg.AllowNullCollections = true;
}
マッパー構成の初期化 で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>();
}
}
これのもう1つの方法は、条件を使用することです。そのため、値がnullでない場合にのみ値をマップします。これには、値がデフォルトでnullである必要がある場合があります(マッピングされないため)。
Mapper.CreateMap<Person, PersonModel>()
.ForMember(
dest => dest.Addresses,
opt => opt => opt.Condition(source=> source.Addresses!= null));
この動作が必要なプロパティのカスタムリゾルバーを定義できるはずです。だから次のようなもの:
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));