使用AutoMapper映射EF Core模型时遇参数数量错误的解决咨询
问题描述
使用最新版AutoMapper映射EF Core自动生成的Language数据库模型与结构一致的自定义Language模型时,出现如下错误:
Incorrect number of arguments supplied for call to method 'DatabaseProvider.Models.Language get_Item(Int32)' (Parameter 'property')
EF Core自动生成的数据库模型
public partial class Language { public int Id { get; set; } public string FullName { get; set; } = null!; public string Abbreviation { get; set; } = null!; public string Description { get; set; } = null!; public string DateFormat { get; set; } = null!; public string TimeFormat { get; set; } = null!; public virtual ICollection<About> Abouts { get; set; } = new List<About>(); public virtual ICollection<Contact> Contacts { get; set; } = new List<Contact>(); public virtual ICollection<PostsTranslation> PostsTranslations { get; set; } = new List<PostsTranslation>(); }
自定义Language模型
public class Language { public int Id { get; set; } public string FullName { get; set; } = null!; public string Abbreviation { get; set; } = null!; public string Description { get; set; } = null!; public string DateFormat { get; set; } = null!; public string TimeFormat { get; set; } = null!; }
原AutoMapper配置代码
public class MapperConfig { public static Mapper InitializeAutomapper() { //Provide all the Mapping Configuration var config = new MapperConfiguration(cfg => { cfg.CreateMap<API.Language, DB.Language>() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) .ForMember(d => d.FullName, opt => opt.MapFrom(s => s.FullName)) .ForMember(d => d.Abbreviation, opt => opt.MapFrom(s => s.Abbreviation)) .ForMember(d => d.Description, opt => opt.MapFrom(s => s.Description)) .ForMember(d => d.DateFormat, opt => opt.MapFrom(s => s.DateFormat)) .ForMember(d => d.TimeFormat, opt => opt.MapFrom(s => s.TimeFormat)); cfg.CreateMap<List<API.Language>, List<DB.Language>>(); cfg.CreateMap<DB.Language, API.Language>() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) .ForMember(d => d.FullName, opt => opt.MapFrom(s => s.FullName)) .ForMember(d => d.Abbreviation, opt => opt.MapFrom(s => s.Abbreviation)) .ForMember(d => d.Description, opt => opt.MapFrom(s => s.Description)) .ForMember(d => d.DateFormat, opt => opt.MapFrom(s => s.DateFormat)) .ForMember(d => d.TimeFormat, opt => opt.MapFrom(s => s.TimeFormat)); cfg.CreateMap<List<DB.Language>, List<API.Language>>(); }); //Create an Instance of Mapper and return that Instance var mapper = new Mapper(config); return mapper; } } }
调用代码
private readonly Mapper _mapper; private readonly DatabaseConnector _connector = new(); private readonly ILogger<DatabaseController> _logger; public DatabaseController(ILogger<DatabaseController> logger) { _mapper = MapperConfig.InitializeAutomapper(); _connector = new DatabaseConnector(); _logger = logger; } [HttpGet("GetLanguages")] public IEnumerable<Language> GetLanguages() { var dbList = _connector.Get<DB.Language>(); var list = _mapper.Map<List<DB.Language>, List<Language>>(dbList); return list; }
解决方法
错误原因
手动配置了List<API.Language>与List<DB.Language>这类集合类型的映射,AutoMapper不需要显式配置集合映射——它会自动基于单个对象的映射规则处理集合,手动配置集合映射会触发内部方法调用错误。
修复步骤
- 删除所有集合类型的映射配置:移除
cfg.CreateMap<List<API.Language>, List<DB.Language>>()和cfg.CreateMap<List<DB.Language>, List<API.Language>>()两行代码。 - 简化单个对象的映射配置:由于两个模型的属性名完全一致,AutoMapper可自动完成映射,无需逐个配置
ForMember;若需明确忽略EF模型中的集合属性(可选,目标模型无对应属性时AutoMapper会自动忽略),可添加IgnoreSourceMembers。 - 添加配置验证:在初始化Mapper时调用
config.AssertConfigurationIsValid(),提前发现配置问题。
修改后的AutoMapper配置代码
public class MapperConfig { public static Mapper InitializeAutomapper() { var config = new MapperConfiguration(cfg => { // 仅配置单个对象的双向映射,AutoMapper自动处理集合 cfg.CreateMap<API.Language, DB.Language>(); cfg.CreateMap<DB.Language, API.Language>() // 可选:显式忽略EF模型中的集合属性 .ForMember(dest => dest, opt => opt.IgnoreSourceMembers(src => src.Abouts, src => src.Contacts, src => src.PostsTranslations)); }); // 验证配置是否有效,提前暴露配置问题 config.AssertConfigurationIsValid(); return new Mapper(config); } }
调用代码说明
原调用代码无需修改,AutoMapper会自动根据单个对象的映射规则,完成List<DB.Language>到List<API.Language>的映射。
内容的提问来源于stack exchange,提问作者Kanasi
相关产品推荐
相关产品推荐

