我使用的是 AutoMapper 6.2.2。
我有两门课:
public class BBB
{
public int b { get; set; }
}
public class AAA
{
public int a { get; set; }
}
请注意,它们具有不同的属性名称。
当我编写一个使用 AAA
->
BBB
之间的映射的简单控制台应用程序时,我没有收到异常:
var a = new AAA();
var b = new BBB();
var config = new MapperConfiguration(cfg => cfg.CreateMap<AAA, BBB>());
var mapper = config.CreateMapper();
var dto = mapper.Map<BBB>(a);
Console.WriteLine(dto); //{b=0}
(没有例外)。
但是,如果我将 .Net Core 与:
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper();
Mapper.AssertConfigurationIsValid();
services.AddControllers();
}
然后在控制器中:
[HttpGet]
public object Get()
{
var a = new AAA();
var t = _mapper.Map<AAA, BBB>(a);
return t;
}
然后,我确实看到了异常:
<块引用>AutoMapper.AutoMapperConfigurationException:未映射的成员是 成立。查看下面的类型和成员。添加自定义映射 表达式、忽略、添加自定义解析器或修改 源/目标类型对于没有匹配的构造函数,添加一个无参数 ctor,添加可选参数,或映射所有构造函数参数 ============ AAA -> BBB(目的地会员名单)AAA -> BBB(目的地会员名单)
未映射的属性:b
问题:
为什么我会在第二种情况下看到异常? (虽然没有出现在第一种情况)
答案 0 :(得分:2)
您看到的差异是由于您自己的实施方式不同造成的。
一开始是猜测,后来被OP证实了,所以是这样的:
控制台版本没有使用 Mapper.AssertConfigurationIsValid();
导致无效配置失败,没有它,AutoMapper 默默地隐藏了失败。
另外,有人问即使没有 Mapper.AssertConfigurationIsValid();
方法,在 NET Core 版本中 AutoMapper 也会失败。我的猜测是 AutoMapper 作者决定不隐藏配置失败并在新版本中实现它,因此当应用无效映射时它会失败。