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(目标成员列表)
未映射的属性:已删除-目标上一长串相关对象和属性
Run Code Online (Sandbox Code Playgroud)Source=AutoMapper StackTrace: at lambda_method(Closure , EditApplicationViewModel , Application , ResolutionContext )
更新:
我还尝试了以下地图。我没有收到任何错误,但没有任何源属性在目标上更新。
config.CreateMap<EditApplicationViewModel, Application>().ForAllOtherMembers(opts=>opts.Ignore());
Run Code Online (Sandbox Code Playgroud)
我能够解决我的问题,这与忽略源和目标之间的名称不匹配的属性无关。默认情况下,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)
不需要其他指令来忽略源或目标上不存在的任何其他属性。
同样,我收到的错误消息是“找到了未映射的成员”。通过我。实际的问题是类型不匹配。
| 归档时间: |
|
| 查看次数: |
5987 次 |
| 最近记录: |