You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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不需要显式配置集合映射——它会自动基于单个对象的映射规则处理集合,手动配置集合映射会触发内部方法调用错误。

修复步骤

  1. 删除所有集合类型的映射配置:移除cfg.CreateMap<List<API.Language>, List<DB.Language>>()和cfg.CreateMap<List<DB.Language>, List<API.Language>>()两行代码。
  2. 简化单个对象的映射配置:由于两个模型的属性名完全一致,AutoMapper可自动完成映射,无需逐个配置ForMember;若需明确忽略EF模型中的集合属性(可选,目标模型无对应属性时AutoMapper会自动忽略),可添加IgnoreSourceMembers。
  3. 添加配置验证:在初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:02:09