【问题标题】:How to fix the unmapped members?如何修复未映射的成员?
【发布时间】:2018-12-27 10:29:37
【问题描述】:

我正在构建一个新项目,用于浏览电影并提出您的意见。现在我在管理部分,我添加了添加电影的功能,但是当我尝试添加电影时,自动映射器会为我将 dto 映射到数据模型的服务上的未映射成员抛出异常。成员来自基本数据模型,例如 id。

编辑

我试图忽略所有产生此异常的成员,还尝试创建一个没有参数但不起作用的构造函数。

// Initialization
Mapper.Initialize(conf =>
        {
            conf.CreateMap<Movie, MovieDto>();
            conf.CreateMap<MovieDto, Movie>();
            conf.CreateMap<MovieDto, MovieViewModel>();
        });

// Base Data Model
public class DataModel
{
    [Key]
    public int Id { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? CreatedOn { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? ModifiedOn { get; set; }

    public bool IsDeleted { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? DeletedOn { get; set; }
}

// Movie Data Model
public class Movie: DataModel
{

    public Movie(string title, double rating, string duration, string type, string description, DateTime releaseDate, string producer)
    {
        this.Title = title;
        this.Rating = rating;
        this.Duration = duration;
        this.Type = type;
        this.Description = description;
        this.ReleaseDate = releaseDate;
        this.Producer = producer;
    }

    // successfully mapped members
}

// Movie DTO
public class MovieDto
{
    public string Title { get; set; }

    public double Rating { get; set; }

    public string Duration { get; set; }

    public string Type { get; set; }

    public string Description { get; set; }

    public DateTime ReleaseDate { get; set; }

    public string Producer { get; set; }
}

 // Add functionality 
 public void AddMovie(MovieDto movie)
 {
      //execption here
      var movieDM = this.mapper.Map<Movie>(movie);

      this.repo.Add(movieDM);

      this.saver.SaveChanges();
 }

这是img上的例外:https://i.imgur.com/RGZP6NP.png

【问题讨论】:

  • Movie 类可能需要一个不带参数的构造函数。
  • 我试过不行。

标签: asp.net .net asp.net-core automapper asp.net-core-mvc-2.1


【解决方案1】:

通过执行以下操作使其工作。 首先,由于DataModel是一个基类,所以我遵循了automapper的映射继承(see docs)。 然后由于您使用映射器实例来映射this.mapper.Map&lt;Movie&gt;(movie),因此配置也需要是实例而不是静态的,我为此使用AutoMapper.Extensions.Microsoft.DependencyInjection nuget 包,它允许将Automapper 注册到IoC 容器。

我的配置如下所示(在 Startup 类的 ConfigureServices 方法中)。

            services.AddAutoMapper(conf =>
        {
            conf.CreateMap<object, DataModel>()
                .ForMember(d => d.Id, opts => opts.Ignore())
                .ForMember(d => d.CreatedOn, opts => opts.MapFrom(_ => DateTime.Now))
                .ForMember(d => d.ModifiedOn, opts => opts.MapFrom(_ => DateTime.Now))
                .ForMember(d => d.DeletedOn, opts => opts.MapFrom(_ => (DateTime?)null))
                .ForMember(d => d.IsDeleted, opts => opts.MapFrom(_ => false))
                .Include<MovieDto, Movie>();
            conf.CreateMap<Movie, MovieDto>();
            conf.CreateMap<MovieDto, Movie>();
        });

请注意,我使用CreateMap&lt;object, DataModel&gt; 进行基类映射,并且只使用硬编码值作为日期,请随意调整以适应您的情况。

注入IMapper的实例后,我可以成功调用this.mapper.Map&lt;Movie&gt;(movie)

希望这能让你朝着好的方向前进。

【讨论】:

    【解决方案2】:

    您可以指定 AutoMapper 不应验证是否正在映射所有属性。在创建映射配置时,MemberList 枚举可用于此目的。例如:

    conf.CreateMap<MovieDto, Movie>(MemberList.None)
    

    但是,屏幕截图中的错误表明另一个映射存在问题,即从 MovieViewModelMovieDto 的映射。我建议您也为这些类型添加映射配置:

    conf.CreateMap<MovieViewModel, MovieDto>(MemberList.None)
    

    【讨论】:

    • 我尝试了你的建议,但没有奏效,它抛出了同样的异常。
    • @Dimitar 错误可能是另一个映射。尝试添加此配置:conf.CreateMap&lt;MovieViewModel, MovieDto&gt;(MemberList.None)。另请参阅更新的答案。
    • 谢谢您,但我尝试了您的建议,但它再次不起作用。
    • 当你说“不工作”时,你是说你得到完全相同的错误吗?
    【解决方案3】:

    你可以试试Profile Instances

    public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {
            CreateMap<OrderViewModel, Order>()
                .ForMember(dest => dest.OrderItem, opt => opt.MapFrom(src => src.OrderItemViewModel));
            CreateMap<OrderItemViewModel, OrderItem>();
            CreateMap<Order, Order>()
                .ForMember(dest => dest.Id, opt => opt.Ignore());
    
            CreateMap<Movie, MovieDto>();
            CreateMap<MovieDto, Movie>();
        }
    }
    

    这是工作演示AutoMapperProfile

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2015-02-06
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2019-11-23
      相关资源
      最近更新 更多