AutoMapper:如何仅映射匹配的 属性 名称并忽略所有其他名称?

AutoMapper: How to map only matching property names and ignore all others?

我是 AutoMapper 新手,使用的是 6.2.2 版。我正在尝试将视图模型映射到实体(也使用 Entity Framework)。我只想更新存在于视图模型和实体中的属性。该实体具有不属于源视图模型的其他导航属性和相关对象。我目前收到一条错误消息,指出我在目标实体上有未映射的属性。我的视图模型和实体都有超过 40 个属性,所以我不想将每个属性都显式添加到地图中。

这是我的代码:

地图:

public static void RegisterMaps()
{
    AutoMapper.Mapper.Initialize(config =>
    {
                    config.CreateMap<EditApplicationViewModel, Application>();

    });

}

我也试过以下但得到同样的错误:

config.CreateMap<EditApplicationViewModel, Application>(MemberList.source);

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(EditApplicationViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        Application application = _applicationService.GetById(viewModel.ApplicationId);

        application = Mapper.Map(viewModel, application);
    }
}

错误信息:

InnerException: HResult=-2146233088 Message= Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters ========================================================== String -> User (Destination member list) System.String -> ..***.entities.User (Destination member list)

Unmapped properties: removed - a very long list of related objects and properties on the destination

   Source=AutoMapper
   StackTrace:
        at lambda_method(Closure , EditApplicationViewModel , Application , ResolutionContext )

更新:

下面的地图我也试过了。我没有收到任何错误,但 none 的源属性已在目标上更新。

config.CreateMap<EditApplicationViewModel, Application>().ForAllOtherMembers(opts=>opts.Ignore());

您可以使用 IgnoreUnMapped() 函数。

          config.CreateMap<EditApplicationViewModel, Application>().IgnoreUnMapped();

可能您在两个模型中的所有属性都没有相同的名称。对于不同的名称属性,您可以使用以下示例:

var source = new Source();

void ConfigureMap(IMappingOperationOptions<Source, Dest> opt) {
    opt.ConfigureMap()
       .ForMember(dest => dest.Value, m => m.MapFrom(src => src.Value))
};

var dest = Mapper.Map<Source, Dest>(source, ConfigureMap);

对于每个新的 属性 名称不匹配,您定义了新的 .ForMember...

我能够解决我的问题,它与忽略源和目标之间名称不匹配的属性无关。 AutoMapper 的默认行为似乎已经默认忽略了这些属性。

错误信息非常具有欺骗性:

  InnerException: 
       HResult=-2146233088
       Message=
Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters
==========================================================
String -> User (Destination member list)
System.String -> ***.***.***.entities.User (Destination member list)

我的问题的真正原因是类型不匹配。我在名为 CreatedByUser 的视图模型中有一个字符串 属性。我的实体上也有一个导航 属性,名为 CreatedByUser,类型为 User。

我不得不在 CreateMap 中明确忽略这个 属性。

 config.CreateMap<EditApplicationViewModel, Application>()
                    .ForMember(d => d.CreatedByUser, opt => opt.Ignore());

不需要其他指令来忽略源或目标上不存在的任何其他属性。

再次,我收到的错误信息"Unmapped members were found."通过我关闭了。实际问题是类型不匹配。