AutoMapper 4.2 不忽略配置文件中的属性
AutoMapper 4.2 not ignoring properties in profile
在我的 Web API 控制器方法中,在我将 UpdatePlaceDTO
映射到 PlaceMaster
之前,我进行了一次数据库调用以填充 Map 未涵盖但用于某些原因 AutoMapper 使这些属性为空。
var mappedPlaceMaster = _mapper.Map<PlaceMaster>(placeMasterDTO);
// mappedPlaceMaster.EntityId is null
我已经尝试了很多 IgnoreExistingMembers 的解决方案,但 none 有效。
这就是我的
public class PlaceMapperProfile : Profile
{
protected override void Configure()
{
// TO DO: This Mapping doesnt work. Need to ignore other properties
//CreateMap<UpdatePlaceDto, PlaceMaster>()
// .ForMember(d => d.Name, o => o.MapFrom(s => s.Name))
// .ForMember(d => d.Description, o => o.MapFrom(s => s.Description))
// .ForMember(d => d.ParentPlaceId, o => o.MapFrom(s => s.ParentPlaceId))
// .ForMember(d => d.LeftBower, o => o.MapFrom(s => s.LeftBower))
// .ForMember(d => d.RightBower, o => o.MapFrom(s => s.RightBower)).IgnoreAllNonExisting();
}
}
这是分机
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
foreach (var property in expression.TypeMap.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
我已经使用模块将映射器注入到我的依赖项中
protected override void Load(ContainerBuilder builder)
{
//register all profile classes in the calling assembly
var profiles =
from t in typeof(Navigator.ItemManagement.Data.MappingProfiles.PlaceMapperProfile).Assembly.GetTypes()
where typeof(Profile).IsAssignableFrom(t)
select (Profile)Activator.CreateInstance(t);
builder.Register(context => new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
.As<IMapper>()
.SingleInstance();
}
我在某些帖子中看到 _mapper.Map 实际上创建了一个新对象,那么我们如何将其 "add-on" 排序为现有的 属性 值?
好的,我找到了解决方案。就在我面前,我没看到!
我只需要使用 Map 函数的重载,它不会创建 PlaceMaster 的新实例,而是分配地图中可用的属性。
mappedPlaceMaster = _mapper.Map(placeMasterDTO, placeMasterFromDatabase);
在我的 Web API 控制器方法中,在我将 UpdatePlaceDTO
映射到 PlaceMaster
之前,我进行了一次数据库调用以填充 Map 未涵盖但用于某些原因 AutoMapper 使这些属性为空。
var mappedPlaceMaster = _mapper.Map<PlaceMaster>(placeMasterDTO);
// mappedPlaceMaster.EntityId is null
我已经尝试了很多 IgnoreExistingMembers 的解决方案,但 none 有效。
这就是我的
public class PlaceMapperProfile : Profile
{
protected override void Configure()
{
// TO DO: This Mapping doesnt work. Need to ignore other properties
//CreateMap<UpdatePlaceDto, PlaceMaster>()
// .ForMember(d => d.Name, o => o.MapFrom(s => s.Name))
// .ForMember(d => d.Description, o => o.MapFrom(s => s.Description))
// .ForMember(d => d.ParentPlaceId, o => o.MapFrom(s => s.ParentPlaceId))
// .ForMember(d => d.LeftBower, o => o.MapFrom(s => s.LeftBower))
// .ForMember(d => d.RightBower, o => o.MapFrom(s => s.RightBower)).IgnoreAllNonExisting();
}
}
这是分机
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
foreach (var property in expression.TypeMap.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
我已经使用模块将映射器注入到我的依赖项中
protected override void Load(ContainerBuilder builder)
{
//register all profile classes in the calling assembly
var profiles =
from t in typeof(Navigator.ItemManagement.Data.MappingProfiles.PlaceMapperProfile).Assembly.GetTypes()
where typeof(Profile).IsAssignableFrom(t)
select (Profile)Activator.CreateInstance(t);
builder.Register(context => new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve))
.As<IMapper>()
.SingleInstance();
}
我在某些帖子中看到 _mapper.Map 实际上创建了一个新对象,那么我们如何将其 "add-on" 排序为现有的 属性 值?
好的,我找到了解决方案。就在我面前,我没看到!
我只需要使用 Map 函数的重载,它不会创建 PlaceMaster 的新实例,而是分配地图中可用的属性。
mappedPlaceMaster = _mapper.Map(placeMasterDTO, placeMasterFromDatabase);