C# 找到自动映射器未映射成员
我们正在为一个项目使用Automapper,似乎随机出现以下错误: AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型 代码已经好几个月没变了。我得到那个错误,刷新,错误消失,页面工作正常。我正在使用C# 找到自动映射器未映射成员,c#,asp.net,automapper,C#,Asp.net,Automapper,我们正在为一个项目使用Automapper,似乎随机出现以下错误: AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型 代码已经好几个月没变了。我得到那个错误,刷新,错误消失,页面工作正常。我正在使用 Mapper.AssertConfigurationIsValid(); 不知道为什么它会抱怨映射不好,然后刷新,然后又恢复正常,有人遇到过这种情况吗?调
Mapper.AssertConfigurationIsValid();
不知道为什么它会抱怨映射不好,然后刷新,然后又恢复正常,有人遇到过这种情况吗?调试没有帮助,因为它是随机的,有时没有错误,然后其他日子它会在网站上的某个地方弹出,回到它,它是好的。随机页面上也会出现错误,而不是相同的页面,也不是相同的映射。快速介绍编辑:正如@mrTurkay在下面回答的那样,这可以通过以下配置解决:
cfg.ValidateInlineMaps = false;
然而,你应该首先理解为什么这个问题会发生——所以请继续阅读
当您尝试映射未为其创建映射配置的对象时,会出现此问题。你需要记住的是,它不一定是你试图映射的特定对象;但是它的一个导航属性
例如,假设您有一个Car.cs
要映射到CarDTO.cs
Car.cs
如下所示:
public class Car
{
public string Color { get; set; }
public Engine Engine { get; set; }
}
Mapper.CreateMap<DTO.CarDTO, Data.Model.Car>();
Mapper.CreateMap<Data.Model.Car, DTO.CarDTO>();
Mapper.CreateMap<DTO.EngineDTO, Data.Model.Engine>();
Mapper.CreateMap<Data.Model.Engine, DTO.EngineDTO>();
并且您的DTO看起来相同,但是有一个对引擎的引用,而不是:
public class CarDTO
{
public string Color { get; set; }
public EngineDTO Engine { get; set; }
}
您按如下方式配置了映射:
public class Car
{
public string Color { get; set; }
public Engine Engine { get; set; }
}
Mapper.CreateMap<DTO.CarDTO, Data.Model.Car>();
Mapper.CreateMap<Data.Model.Car, DTO.CarDTO>();
Mapper.CreateMap<DTO.EngineDTO, Data.Model.Engine>();
Mapper.CreateMap<Data.Model.Engine, DTO.EngineDTO>();
因此,当Automapper从Engine
映射到EngineDTO
时,它也会尝试将部分映射到,但由于您忘记在全局.asax
中声明映射,因此会出现错误:
AutoMapper.AutoMapperConfigurationException:未映射的成员为
建立查看下面的类型和成员。添加自定义映射
表达式、忽略、添加自定义解析程序或修改
源/目标类型
如果不想映射类上的某些属性,可以使用“忽略”:
Mapper.CreateMap<Engine, EngineDTO>()
.ForMember(x => x.Parts, opt => opt.Ignore());
Global.asax:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<CarProfile>();
}
Mapper.Initialize(cfg=>
{
AddProfile();
}
这是关于验证的
cfg.ValidateInlineMaps = false;
应该足够了在我的例子中,我忘记了将映射配置添加到MapConfig.cs。可能它“工作正常”之后,因为调用assertconfigurationsvalid
是在应用程序启动时发生的,应用程序现在已启动,因此不会再次被调用。内部异常应该会准确地告诉您问题所在。@KirkWoll我也猜到了,这是由于应用程序在一天中第一次启动,可能是什么原因ng在进行映射时未准备就绪。我已尝试重置IIS和应用程序池,但它仍然是随机的,无法复制错误。@AndrewHitaker完整错误为AutoMapper.AutoMapperConfigurationException:找到未映射的成员。请查看下面的类型和成员。添加自定义映射表达式,忽略,添加自定义解析lver,或修改源/目标类型RETel->SelectItem(目标成员列表)DomainClasses.RETel->Models.SelectItem(目标成员列表)但是再次刷新,这很好,并且对于这个映射并不总是发生在这个页面上。我在其他页面上为其他映射得到了它,它并不总是发生。如果您按照您看到的方式修复问题,那么它们就不会再出现了。您还可以创建一个单元测试,在您的映射上调用assertconfigurationsvalid
,并获取问题的完整列表有什么方法可以忽略未映射的属性?@tchelidze是的,您可以忽略属性:“.FormMember(dest=>dest.Users,options=>options.ignore()”@SimonD感谢Simon,我的意思是隐式而非显式地忽略成员检查这个问题:这个答案被严重低估了。我一直在努力将旧的AutoMapper 2.x配置转换为8.x,而无需手动更改数百条映射语句。几乎我所有的映射都是直截了当的Mapper.CreateMap()以旧格式。似乎要删除所有这些并使用AutoMapper.Mapper.Initialize(cfg=>{cfg.ValidateInlineMaps=false;cfg.CreateMissingTypeMaps=true;});到目前为止,在应用程序启动中,除了少数边缘情况外,还有足够的替代。这些建议似乎都不再有效,因为MapperConfiguration不会公开名为ValidateInlineMaps的成员,而Mapper也不会公开名为Initialize的成员。