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

Rok*_*kal 2 c# automapper automapper-6

我是AutoMapper的新手,正在使用6.2.2版。我正在尝试将视图模型映射到实体(也使用Entity Framework)。我只想更新同时存在于视图模型和实体中的属性。该实体具有其他导航属性和相关对象,这些属性不属于源视图模型。我目前收到一个错误,提示我在目标实体上没有映射属性。我的视图模型和实体都具有40多个属性,因此我不想显式地将每个属性添加到地图。

这是我的代码:

地图:

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

    });

}
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下方法,但得到相同的错误:

config.CreateMap<EditApplicationViewModel, Application>(MemberList.source);
Run Code Online (Sandbox Code Playgroud)

控制器:

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

        application = Mapper.Map(viewModel, application);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

InnerException:HResult = -2146233088消息=找到了未映射的成员。在下面查看类型和成员。添加自定义映射表达式,忽略,添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,请添加no-arg ctor,添加可选参数或映射所有构造函数参数======= ================================================== =字符串->用户(目标成员列表)System.String-> 。***。entities.User(目标成员列表)

未映射的属性:已删除-目标上一长串相关对象和属性

   Source=AutoMapper
   StackTrace:
        at lambda_method(Closure , EditApplicationViewModel , Application , ResolutionContext )
Run Code Online (Sandbox Code Playgroud)

更新:

我还尝试了以下地图。我没有收到任何错误,但没有任何源属性在目标上更新。

config.CreateMap<EditApplicationViewModel, Application>().ForAllOtherMembers(opts=>opts.Ignore());
Run Code Online (Sandbox Code Playgroud)

Rok*_*kal 7

我能够解决我的问题,这与忽略源和目标之间的名称不匹配的属性无关。默认情况下,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)
Run Code Online (Sandbox Code Playgroud)

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

我必须在CreateMap中显式忽略此属性。

 config.CreateMap<EditApplicationViewModel, Application>()
                    .ForMember(d => d.CreatedByUser, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

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

同样,我收到的错误消息是“找到了未映射的成员”。通过我。实际的问题是类型不匹配。