C# Automapper返回空集合,我需要空集合

C# Automapper返回空集合,我需要空集合,c#,.net,automapper,C#,.net,Automapper,如果Person上的Addresses属性为null,则它们将作为空的可枚举项而不是null映射到PersonModel上 如何使PersonModel具有空地址而不是空的可枚举项?因此,使用Automapper可能有几种方法可以实现这一点,这只是其中之一: Mapper.DynamicMap<Person, PersonModel>(person); 此代码使用新的c?。运算符,因此如果无法在代码中使用该功能,则可能需要删除该属性并检查其是否为null。您应该能够为要在其上执行此

如果Person上的Addresses属性为null,则它们将作为空的可枚举项而不是null映射到PersonModel上


如何使PersonModel具有空地址而不是空的可枚举项?

因此,使用Automapper可能有几种方法可以实现这一点,这只是其中之一:

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

此代码使用新的c?。运算符,因此如果无法在代码中使用该功能,则可能需要删除该属性并检查其是否为null。

您应该能够为要在其上执行此行为的属性定义自定义解析程序。比如:

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

另一种替代方法是使用条件,因此仅在值不为null时映射该值。 这可能需要将该值默认为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));

简单的答案是使用AllowNullCollections:

或者如果您使用实例API

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.AllowNullCollections = true;
});
除了如中所述在中设置AllowNullCollections外,您还可以选择在配置文件定义中设置AllowNullCollections,如下所示:

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

为什么要在地图上添加DynamicMap?是的,这是AutoMaper中一个可怕的错误。如果EF中有一个实体显式加载集合,该怎么办?您决定不需要加载集合,然后在将对象从dto映射到EF类型后保存数据,并在保存时永久清除信息。不仅如此,我们还在集合上使用虚拟。一旦我们切换到删除所有虚拟ICollection属性,我们就会遭遇大量数据丢失。这是最好的方法吗?最正确的方法是什么?也不允许我使用Mapper.DynamicMap。这在很大程度上取决于您的情况,如果您使用的是Automapper的投影功能,则此功能不起作用,或者上次我使用Automapper时它不起作用。如果你一次只做一个模型,那么[我]完全可以接受。@c0D3l0g1c我在评论中问你为什么要使用DynamicMap,有没有具体的原因?因为我一直在使用DynamicMap,它内部有CreateMap,通过使用这种方法,我想需要为Person-lazyness中的所有对象设置CreateMap。它不应该是src.Addresses?Any而不是dest.Addresses?Any吗?或者我有什么问题吗?您想知道源文件是否为空,如果是,请保留目标文件为空。这应该是正确答案,为我节省了一些时间,谢谢。仅此而已!=空但是。如果我有多个配置文件,我应该在每个配置文件中都这样做还是设置一次?@Morasiu,如果你希望所有配置文件都以相同的方式运行,那么在初始值设定项中这样做可能更有意义,尤其是如果你希望配置文件始终使用相同的初始值设定项。如果希望某些配置文件以一种方式工作,而其他配置文件以另一种方式工作,则必须在配置文件级别处理此问题。
AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.AllowNullCollections = true;
});
new MapperConfiguration(cfg =>
{
    cfg.AllowNullCollections = true;
}
public class MyMapper : Profile
{
    public MyMapper()
    {
        // Null collections will be mapped to null collections instead of empty collections.
        AllowNullCollections = true;

        CreateMap<MySource, MyDestination>();
    }
}