找到自动映射器未映射的成员

时间:2018-09-26 18:20:07

标签: c# asp.net-mvc automapper

发疯了...

型号:

public class CountryModel
{
    public int Id { get; set; }

    [Required (ErrorMessage = "A value is required")]
    [StringLength(30, MinimumLength = 4, ErrorMessage = "Minimum value is 4 characters")]
    public string Name { get; set; }
}

ENTITFRAMEWORK数据库模型

public partial class Country
{
    public Country()
    {
        this.City = new HashSet<City>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<City> City { get; set; }
}

映射器:

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<Country, CountryModel>();
                cfg.CreateMap<CountryModel, Country>().ForMember(x=> x.City, opt => opt.Ignore());
            }
        );
    }
}

城市故障...我在做什么错?

编辑:使用Automapper V7.0.1

EDIT2:

这样映射:

    public int AddCountry(CountryModel model)
    {
        var mappedC = _mapper.Map<CountryModel, Country>(model);

        int countryId = _locationManager.AddCountry(mappedC);

        return 1;
    }

我正在从countrymodel(源)映射到Country(目的地)

EDit 3:

错误消息:

  

找到未映射的成员。在下面查看类型和成员。添加一个   自定义映射表达式,忽略,添加自定义解析器或修改   源/目标类型对于没有匹配的构造函数,请添加一个无参数   ctor,添加可选参数或映射所有构造函数参数   ================================================== =================== AutoMapper为您创建了此类型映射,但是您的类型不能为   使用当前配置映射。 CountryModel->国家   (目标成员列表)NetworkTool.Models.Location.CountryModel->   NetworkTool.Data.Country(目标成员列表)

     

未映射的属性:城市

2 个答案:

答案 0 :(得分:1)

您正在映射的代码很好,如果一切配置正确,它应该可以正常工作。我相信您遇到的问题是,在为示例正确配置AM的同时,进行从模型到实体的转换的实际映射器并未使用您的实际配置。像Eric一样,我运行了您提供的代码,并且运行良好。...除非我注释掉配置中的实际映射。我认为您收到此异常的原因是因为AM尝试使用其自己的约定映射而不是您定义的映射进行转换。 AM无需配置即可自动找出ID和名称,但在城市上则失败。您需要确保_mapper实际上指向“配置的映射器”。

如果我运行此命令(如您所愿),代码可以正常工作。

public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Country, CountryModel>();
            cfg.CreateMap<CountryModel, Country>();.ForMember(x => x.City, opt => opt.Ignore());
        });
    }

如果我运行此命令(注释掉了映射),它将抛出未映射的异常。

public static void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Country, CountryModel>();
            //cfg.CreateMap<CountryModel, Country>();.ForMember(x => x.City, opt => opt.Ignore());
        });
    }

答案 1 :(得分:1)

跟随This guide on automaper + structuremap

在默认注册表中,我有这个:

    var config = new MapperConfiguration(cfg =>
    {
        foreach (var profile in profiles)
        {
            cfg.AddProfile(profile);
        }
    });

    //Create a mapper that will be used by the DI container
    var mapper = config.CreateMapper();

    //Register the DI interfaces with their implementation
    For<IMapperConfiguration>().Use(config);
    For<IMapper>().Use(mapper);

这显然改变了我的自动映射器设置。

我不得不将其更改为:

var mapper = AutoMapperConfiguration.Configure();

For<IMapper>().Use(mapper.CreateMapper());

并将初始映射更改为:

public class AutoMapperConfiguration
{
    public static MapperConfiguration Configure()
    {
        var mapper = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Country, CountryModel>();
                cfg.CreateMap<CountryModel, Country>().ForMember(x => x.City, opt => opt.Ignore());
            }
        );

        return mapper;
    }
}

然后我的mappng最终完成了