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."通过我关闭了。实际问题是类型不匹配。
我是 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."通过我关闭了。实际问题是类型不匹配。