簡體   English   中英

無法將Auto Mapper與.net Core 2.2一起使用

[英]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();
});

參考

自動映射器將DataTable映射到POCO列表

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM