7

我是 AutoMapper 的新手并使用 6.2.2 版。我正在尝试将视图模型映射到实体(也使用实体框架)。我只想更新视图模型和实体中存在的属性。该实体具有不属于源视图模型的其他导航属性和相关对象。我目前收到一个错误,表明我在目标实体上有未映射的属性。我的视图模型和实体都有超过 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 消息=找到未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,添加无参数 ctor、添加可选参数或映射所有构造函数参数 ======= ==================================================== = 字符串 -> 用户(目标成员列表) System.String -> .***.entities.User(目标成员列表)

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

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

更新:

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

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

3 回答 3

10

我能够解决我的问题,它与忽略源和目标之间名称不匹配的属性无关。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 的字符串属性。我的实体上还有一个导航属性,称为 User 类型的 CreatedByUser。

我必须在 CreateMap 中明确忽略此属性。

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

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

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

于 2018-05-07T16:53:13.577 回答
0

您可以使用 IgnoreUnMapped() 函数。

          config.CreateMap<EditApplicationViewModel, Application>().IgnoreUnMapped();
于 2018-05-04T14:57:25.773 回答
0

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

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...

于 2018-05-04T14:57:52.020 回答