I'm using Mapperly as the mapping library in ABP Framework instead of AutoMapper. The code works perfectly at runtime, but I'm getting compilation errors in the IDE for partial methods with accessibility modifiers.
*********************************************************************************************************************************************************************************************************Something like this : Errors: *********************************************************************************************************************************************************************************************************okToBookDtoMapper.Map(Book)' must have an implementation part because it has accessibility modifiers. Partial method 'CoreBookToBookDtoMapper.Map(Book, BookDto)' must have an implementation part because it has accessibility modifiers. Partial method 'CoreCreateUpdateBookDtoToBookMapper.Map(CreateUpdateBookDto)' must have an implementation part because it has accessibility modifiers. Partial method 'CoreCreateUpdateBookDtoToBookMapper.Map(CreateUpdateBookDto, Book)' must have an implementation part because it has accessibility modifiers.
Code : *********************************************************************************************************************************************************************************************************using System; using Riok.Mapperly.Abstractions; using Volo.Abp.Mapperly; using Core.Books; using Core.Agencies; using Core.Tasks; using TaskEntity = Core.Tasks.Task; using Core.Schedules; using Core.Locations; using LocationEntity = Core.Locations.Location; using Core.Patients; using Core.Practitioners; using Core.ServiceTypes;
namespace Core;
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreBookToBookDtoMapper : MapperBase<Book, BookDto> { public override partial BookDto Map(Book source);
public override partial void Map(Book source, BookDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateBookDtoToBookMapper : MapperBase<CreateUpdateBookDto, Book> {
public override partial Book Map(CreateUpdateBookDto source);
public override partial void Map(CreateUpdateBookDto source, Book destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreAgencyToAgencyDtoMapper : MapperBase<Agency, AgencyDto> { public override partial AgencyDto Map(Agency source);
public override partial void Map(Agency source, AgencyDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateAgencyDtoToAgencyMapper : MapperBase<CreateUpdateAgencyDto, Agency> {
public override partial Agency Map(CreateUpdateAgencyDto source);
public override partial void Map(CreateUpdateAgencyDto source, Agency destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreTaskToTaskDtoMapper : MapperBase<TaskEntity, TaskDto> { public override partial TaskDto Map(TaskEntity source);
public override partial void Map(TaskEntity source, TaskDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateTaskDtoToTaskMapper : MapperBase<CreateUpdateTaskDto, TaskEntity> { public override TaskEntity Map(CreateUpdateTaskDto source) => throw new NotImplementedException("Use Map(source, destination) instead");
public override partial void Map(CreateUpdateTaskDto source, TaskEntity destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreLocationToLocationDtoMapper : MapperBase<LocationEntity, LocationDto> { public override partial LocationDto Map(LocationEntity source);
public override partial void Map(LocationEntity source, LocationDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateLocationDtoToLocationMapper : MapperBase<CreateUpdateLocationDto, LocationEntity> { public override LocationEntity Map(CreateUpdateLocationDto source) => throw new NotImplementedException("Use Map(source, destination) instead");
public override partial void Map(CreateUpdateLocationDto source, LocationEntity destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreScheduleToScheduleDtoMapper : MapperBase<Schedule, ScheduleDto> { public override partial ScheduleDto Map(Schedule source);
public override partial void Map(Schedule source, ScheduleDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateScheduleDtoToScheduleMapper : MapperBase<CreateUpdateScheduleDto, Schedule> { public override Schedule Map(CreateUpdateScheduleDto source) => throw new NotImplementedException("Use Map(source, destination) instead");
public override partial void Map(CreateUpdateScheduleDto source, Schedule destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreScheduleSeriesToScheduleSeriesDtoMapper : MapperBase<ScheduleSeries, ScheduleSeriesDto> { [MapperIgnoreTarget(nameof(ScheduleSeriesDto.TaskIds))] public override partial ScheduleSeriesDto Map(ScheduleSeries source);
[MapperIgnoreTarget(nameof(ScheduleSeriesDto.TaskIds))]
public override partial void Map(ScheduleSeries source, ScheduleSeriesDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateScheduleSeriesDtoToScheduleSeriesMapper : MapperBase<CreateUpdateScheduleSeriesDto, ScheduleSeries> { public override ScheduleSeries Map(CreateUpdateScheduleSeriesDto source) => throw new NotImplementedException("Use Map(source, destination) instead");
public override partial void Map(CreateUpdateScheduleSeriesDto source, ScheduleSeries destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CorePatientToPatientDtoMapper : MapperBase<Patient, PatientDto> { public override partial PatientDto Map(Patient source);
public override partial void Map(Patient source, PatientDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdatePatientDtoToPatientMapper : MapperBase<CreateUpdatePatientDto, Patient> { public override partial Patient Map(CreateUpdatePatientDto source);
public override partial void Map(CreateUpdatePatientDto source, Patient destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CorePractitionerToPractitionerDtoMapper : MapperBase<Practitioner, PractitionerDto> { public override partial PractitionerDto Map(Practitioner source);
public override partial void Map(Practitioner source, PractitionerDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdatePractitionerDtoToPractitionerMapper : MapperBase<CreateUpdatePractitionerDto, Practitioner> { public override partial Practitioner Map(CreateUpdatePractitionerDto source);
public override partial void Map(CreateUpdatePractitionerDto source, Practitioner destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreServiceTypeToServiceTypeDtoMapper : MapperBase<ServiceType, ServiceTypeDto> { public override partial ServiceTypeDto Map(ServiceType source);
public override partial void Map(ServiceType source, ServiceTypeDto destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] public partial class CoreCreateUpdateServiceTypeDtoToServiceTypeMapper : MapperBase<CreateUpdateServiceTypeDto, ServiceType> { public override partial ServiceType Map(CreateUpdateServiceTypeDto source);
public override partial void Map(CreateUpdateServiceTypeDto source, ServiceType destination);
}
3 Answer(s)
-
0
- This is not an ABP/Mapperly runtime problem; it’s an IDE design-time compiler / analyzer problem.
- In ABP, defining Mapperly mappers like below is correct and should compile because Mapperly generates the “implementation part” during build:
[Mapper] public partial class CoreBookToBookDtoMapper : MapperBase<Book, BookDto> { public override partial BookDto Map(Book source); public override partial void Map(Book source, BookDto destination); }- The CS8795 message (“must have an implementation part because it has accessibility modifiers”) typically appears in the IDE when the editor is not seeing the source-generator output, even though
dotnet builddoes. That’s why runtime/build is fine, but the IDE shows errors.
Fix (practical, ABP-safe)
- Ensure you build the project at least once (from command line) so Mapperly’s generated code exists:
dotnet cleandotnet build
- Restart the IDE (Visual Studio / Rider). This forces the design-time compiler to reload generated sources.
- Delete
bin/andobj/folders for the project(s) containing the mappers, then rebuild. - If you use Visual Studio, make sure you are on a recent version (the design-time source-generator pipeline had issues in older VS versions). Upgrading VS usually fixes “generator not picked up in editor” symptoms.
- Keep your signatures exactly as ABP docs show:
public override partial ...(don’t convert them to non-partial, and don’t removeoverride), because ABP’sMapperBase<TSource,TDestination>is designed for this pattern.
If you follow the steps above, the IDE should stop reporting CS8795 while keeping the correct ABP + Mapperly integration.
Sources (verified)
- https://abp.io/docs/10.0/framework/infrastructure/object-to-object-mapping
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
-
0
Not Satisfactory: Provide Clear solution, although it was Built for .NetCore
-
0
hi
What is your IDE?
VS 2026?
Can you share a demo project?
liming.ma@volosoft.com
Thanks.