将 MaxDepth 设置为 1 时,Automapper 10 不会映射集合属性
Automapper 10 wouldn't map collection properties when setting MaxDepth to 1
从 Automapper 9 迁移到 10 时,ICollection 类型的属性未映射。我使用的是 .NET 5。
我有以下设置:
private class Class1
{
public int Id { get; set; }
}
private class Class2
{
public int Id { get; set; }
public ICollection<Class1> ChildClasses { get; set; }
}
private class Class2Bis
{
public int Id { get; set; }
public ICollection<Class1> ChildClasses { get; set; }
}
private class MapperProfile : Profile
{
public MapperProfile()
{
CreateMap<Class2, Class2Bis>().ReverseMap();
}
}
我正在使用使用 AutoMapper.Extensions.Microsoft.DependencyInjection 模块的辅助方法注入映射器:
public static IServiceCollection AddMapper(this IServiceCollection services, params Assembly[] assemblies)
{
return services.AddAutoMapper(cfg =>
{
cfg.ForAllMaps((map, exp) => exp.MaxDepth(1));
cfg.AllowNullCollections = true;
cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
},
assemblies);
}
以下测试使用 Automapper 9 成功但使用 Automapper 10 失败:
[Fact]
public void Should_Map_ClassesWithCollectionProperties()
{
var object2 = new Class2
{
Id = 1,
ChildClasses = new List<Class1>()
{
new Class1
{
Id = 1
}
}
};
var object2Bis = _mapper.Map<Class2Bis>(object2);
Assert.Equal(object2.ChildClasses.Count, object2Bis.ChildClasses.Count);
}
object2Bis 在使用 Automapper 10 时有一个空的 ChildClasses 属性。
删除 cfg.ForAllMaps((map, exp) => exp.MaxDepth(1));
或将 MaxDepth
设置为 2(或更大的数字)使代码对我有用。 10.0 Upgrade Guide 中有下一个注释:
When reaching MaxDepth
, destination collections are null/empty, they used to contain null values.
从 Automapper 9 迁移到 10 时,ICollection 类型的属性未映射。我使用的是 .NET 5。
我有以下设置:
private class Class1
{
public int Id { get; set; }
}
private class Class2
{
public int Id { get; set; }
public ICollection<Class1> ChildClasses { get; set; }
}
private class Class2Bis
{
public int Id { get; set; }
public ICollection<Class1> ChildClasses { get; set; }
}
private class MapperProfile : Profile
{
public MapperProfile()
{
CreateMap<Class2, Class2Bis>().ReverseMap();
}
}
我正在使用使用 AutoMapper.Extensions.Microsoft.DependencyInjection 模块的辅助方法注入映射器:
public static IServiceCollection AddMapper(this IServiceCollection services, params Assembly[] assemblies)
{
return services.AddAutoMapper(cfg =>
{
cfg.ForAllMaps((map, exp) => exp.MaxDepth(1));
cfg.AllowNullCollections = true;
cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
},
assemblies);
}
以下测试使用 Automapper 9 成功但使用 Automapper 10 失败:
[Fact]
public void Should_Map_ClassesWithCollectionProperties()
{
var object2 = new Class2
{
Id = 1,
ChildClasses = new List<Class1>()
{
new Class1
{
Id = 1
}
}
};
var object2Bis = _mapper.Map<Class2Bis>(object2);
Assert.Equal(object2.ChildClasses.Count, object2Bis.ChildClasses.Count);
}
object2Bis 在使用 Automapper 10 时有一个空的 ChildClasses 属性。
删除 cfg.ForAllMaps((map, exp) => exp.MaxDepth(1));
或将 MaxDepth
设置为 2(或更大的数字)使代码对我有用。 10.0 Upgrade Guide 中有下一个注释:
When reaching
MaxDepth
, destination collections are null/empty, they used to contain null values.