发疯了...
型号:
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(目标成员列表)
未映射的属性:城市
答案 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最终完成了