[英]Unable to use Auto Mapper with .net core 2.2
我无法将Auto Mapper与.net core 2.2一起使用。 它不断抛出此错误:
找到未映射的成员。 在下面查看类型和成员。 添加自定义映射表达式,忽略,添加自定义解析器或修改源/目标类型对于没有匹配的构造函数,请添加no-arg ctor,添加可选参数或映射所有构造函数参数======= ================================================== ================================================== ================================================== ========================================== AutoMapper为您创建了此类型映射,但是您的类型无法使用当前配置进行映射。 IDataReader->列表
1 (Destination member list) System.Data.IDataReader -> System.Collections.Generic.List
1 [[Models.EngineModel,Models,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]](目标成员列表)未映射的属性:容量
这是我的EngineModel类:
public class EngineModel
{
public string Id { get; set; }
public int engineNo { get; set; }
public string engineHost { get; set; }
}
这是我的个人资料:
public class EngineMappingProfile : Profile
{
public EngineMappingProfile()
{
CreateMap<IDataReader, EngineModel>()
.ForMember(dest => dest.Id , opt => opt.MapFrom(src => src.GetString(src.GetOrdinal("ID"))))
.ForMember(dest => dest.engineNo , opt => opt.MapFrom(src => src.GetInt32(src.GetOrdinal("ENG_NO"))))
.ForMember(dest => dest.engineHost , opt => opt.MapFrom(src => src.GetString(src.GetOrdinal("ENG_HOST"))))
}
}
这是我的Startup.cs ConfigureServices方法:
public void ConfigureServices(IServiceCollection services)
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile<EngineMappingProfile>();
});
services.AddAutoMapper();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});
}
以上所有代码都在我的API项目中。 我在我的业务项目中使用了这些配置文件:
var enginesData = AutoMapper.Mapper.Map<IDataReader, List<EngineModel>>(dataReader.mcDataReader);
我正在使用“ AutoMapper.Extensions.Microsoft.DependencyInjection(6.0.0)”和“ AutoMapper(8.0.0)”
您只需要从NuGet软件包中安装AutoMapper.Data (在您的情况下为3.0.0),然后在启动时添加以下代码:
services.AddAutoMapper(cfg =>
{
cfg.AddDataReaderMapping();
});
参考
https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/issues/50
AutoMapper抱怨是因为IDataReader
具有其他未指定的属性。 您要么需要全部映射(在这种情况下显然是不需要的),要么指定应忽略它们,例如:
CreateMap<IDataReader, EngineModel>()
.ForMember(...)
.ForMember(...)
.ForMember(...)
.ForAllOtherMembers(x => x.Ignore()); // < -- Add this line
我使用的版本与您的相同,因此这就是我自动映射器的方法
在我的startup.cs中,我只需要这个
services.AddAutoMapper(config => config.ValidateInlineMaps = false);
以及我如何创建Profile类
public class CommentProfile : Profile
{
public CommentProfile()
{
CreateMap<Comment, CommentDto>(MemberList.None).ReverseMap();
}
}
public class Comment : BaseEntity
{
public string Content { get; set; }
public virtual Comment ParentComment { get; set; }
public virtual Post Post { get; set; }
public virtual User? User { get; set; }
public CommentStatus CommentStatus { get; set; }
}
public class CommentDto
{
public int Id { get; set; }
public Guid UniqeId { get; set; }
public string Content { get; set; }
public Comment ParentComment { get; set; }
public CommentStatus CommentStatus { get; set; }
public DateTime DateCreated { get; set; }
}
您只需要:
services.AddAutoMapper();
IMapper
注册到服务集合中,并自动应用名称空间(从Profile
继承的任何类)中的所有配置文件。
然后,应该注入IMapper
,而不要使用静态Mapper
。 在您的控制器中:
public class MyController : Controller
{
private readonly IMapper _mapper;
public MyController(IMapper mapper)
{
_mapper = mapper;
}
然后,当您想映射一些东西时:
var enginesData = _mapper.Map<List<EngineModel>>(dataReader.mcDataReader);
但是,您不能直接将IDataReader
实例映射到列表,这是您的主要问题。 您需要枚举将行作为项目存储在列表中的数据读取器,然后可以从该列表映射到List<EngineModel>
。 不过,在那时可能更有意义的是从字面上仅将行作为EngineModel
并在枚举数据读取器时构建列表。 然后,根本不需要映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.