Skip to content

Upgrading AutoMapper 14 to 15

Breaking14.0.0 → 15.1.3Breaking4Security5Changed4Fixed3Other4

BreakingUpgrade verdict

4 breaking changes and 5 security fixes.

  • This release replaces 15.0.0 and undoes its changes: the AddAutoMapper overloads again treat finding maps and finding dependencies as separate steps, which cannot be combined.
  • You now need a license key to use AutoMapper, set through the configuration.
  • AutoMapper is no longer MIT licensed; it is now offered under a dual commercial and open-source license.
  • If you create MapperConfiguration directly, you must now pass a logger factory; using services.AddAutoMapper supplies it automatically.
Top 5 of 9 that need code or config changes

Target frameworks requirement changed in 15.1.3: net8.0 → .NETStandard2.0, net8.0, net9.0.

Breaking4
Supersedes 15.0.0, reverting behavior and overloads so AddAutoMapper overloads separate map scanning from dependency scanning.
AddAutoMapper
Requires a license key to be configured.
LicenseKey
Moves from the MIT license to a dual commercial/OSS license.
MapperConfiguration now requires an ILoggerFactory for logging.
MapperConfigurationILoggerFactoryMapperConfigurationExpressionservices.AddAutoMapper
Security5
Fixes GHSA-rvv3-g6hj-g44x by defaulting MaxDepth to 64 for self-referential types, preventing uncontrolled recursion during mapping.
MaxDepth
Fixes uncontrolled recursion on cyclic or self-referential object graphs that could cause stack exhaustion and denial of service; users should upgrade.
Notes that applications processing untrusted or attacker-controlled object graphs through affected mapping paths may be impacted.
Recommends upgrading to this release to address the recursion vulnerability.
Bumps JsonWebTokens to address GHSA-8g4q-xg66-9fp4, fixing #4575.
JsonWebTokens

Generated by DepDelta from published .NET assemblies. Not mixed with prose notes.

  • changed: ctor MapperConfiguration(Action<IMapperConfigurationExpression> configure) → ctor MapperConfiguration(Action<IMapperConfigurationExpression> configure, ILoggerFactory loggerFactory)
  • changed: ctor MapperConfiguration(MapperConfigurationExpression configurationExpression) → ctor MapperConfiguration(MapperConfigurationExpression configurationExpression, ILoggerFactory loggerFactory)
  • added: method MemberMap.CloseGenerics(TypeMap typeMap): IValueResolver
  • added: property IMapperConfigurationExpression.LicenseKey: string { get; set; }
  • added: property MapperConfigurationExpression.LicenseKey: string { get; set; }
  • added: property MapperConfigurationExpression.ServiceLifetime: ServiceLifetime { get; set; }
  • added: property MemberMap.ProjectToExpression: LambdaExpression { get; }
  • added: property MemberMap.SourceMemberName: string { get; }
  • added: property PathConfigurationExpression.Ignored: bool { get; }
  • added: method ClassValueResolver.CloseGenerics(TypeMap typeMap): IValueResolver
  • added: method ExpressionResolver.CloseGenerics(TypeMap typeMap): IValueResolver
  • added: method FuncResolver.CloseGenerics(TypeMap typeMap): IValueResolver
  • added: method ValueConverter.CloseGenerics(TypeMap typeMap): IValueResolver
  • added: property ClassValueResolver.ProjectToExpression: LambdaExpression { get; }
  • added: property ExpressionResolver.SourceMemberName: string { get; }
  • added: property FuncResolver.ProjectToExpression: LambdaExpression { get; }
  • added: property FuncResolver.SourceMemberName: string { get; }
  • added: property MemberPathResolver.SourceMemberName: string { get; }
  • added: property ValueConverter.ProjectToExpression: LambdaExpression { get; }
  • added: property IGlobalConfiguration.LicenseKey: string { get; }
  • removed: sealed class StringToEnumMapper implements IObjectMapper
  • changed: method StringToEnumMapper.MapExpression(IGlobalConfiguration configuration, ProfileMap profileMap, MemberMap memberMap, Expression sourceExpression, Expression destExpression): Expression → method StringToEnumMapper.MapExpression(IGlobalConfiguration configurationProvider, ProfileMap profileMap, MemberMap memberMap, Expression sourceExpression, Expression destExpression): Expression
  • added: class StringToEnumMapper implements IObjectMapper
  • added: method AssignableMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ConstructorMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ConversionOperatorMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ConvertMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method EnumToEnumMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method FromDynamicMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method FromStringDictionaryMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method KeyValueMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ObjectMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ParseStringMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method StringToEnumMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ToDynamicMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ToStringDictionaryMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method ToStringMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • added: method UnderlyingTypeEnumMapper.GetAssociatedTypes(TypePair initialTypes): TypePair?
  • removed: static method ServiceCollectionExtensions.AddAutoMapper(IServiceCollection services, Assembly[] assemblies): IServiceCollection
  • removed: static method ServiceCollectionExtensions.AddAutoMapper(IServiceCollection services, IEnumerable<Assembly> assemblies, ServiceLifetime serviceLifetime = …): IServiceCollection
  • removed: static method ServiceCollectionExtensions.AddAutoMapper(IServiceCollection services, Type[] profileAssemblyMarkerTypes): IServiceCollection