Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找到自动映射器未映射成员_C#_Asp.net_Automapper - Fatal编程技术网

C# 找到自动映射器未映射成员

C# 找到自动映射器未映射成员,c#,asp.net,automapper,C#,Asp.net,Automapper,我们正在为一个项目使用Automapper,似乎随机出现以下错误: AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型 代码已经好几个月没变了。我得到那个错误,刷新,错误消失,页面工作正常。我正在使用 Mapper.AssertConfigurationIsValid(); 不知道为什么它会抱怨映射不好,然后刷新,然后又恢复正常,有人遇到过这种情况吗?调

我们正在为一个项目使用Automapper,似乎随机出现以下错误:

AutoMapper.AutoMapperConfigurationException:找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目标类型

代码已经好几个月没变了。我得到那个错误,刷新,错误消失,页面工作正常。我正在使用

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的成员。