Как исправить несопоставленные элементы? - PullRequest
0 голосов
/ 27 декабря 2018

Я строю новый проект для просмотра фильмов и высказываю ваше мнение о них.Теперь я нахожусь в административной части и добавил функциональность для добавления фильма, но когда я пытаюсь добавить фильм, автомат создает исключение для не отображенных членов в службе, где я сопоставляю dto с моделью данных.Члены взяты из базовой модели данных, например, идентификатор.

РЕДАКТИРОВАТЬ :

Я пытался игнорировать всех членов, которые делают это исключение, также пытался сделатьконструктор без аргументов, но не работает.

// 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

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Получил это, сделав следующее.Во-первых, поскольку DataModel является базовым классом, я следовал за наследованием отображений автомпера (см. Документы) .Затем, поскольку вы используете экземпляр mapper для сопоставления this.mapper.Map<Movie>(movie), конфигурация должна быть также экземпляром, а не статическим, и для этого я использую пакет nuget AutoMapper.Extensions.Microsoft.DependencyInjection, который позволяет зарегистрировать Automapper с контейнером IoC.

Моя конфигурация выглядит следующим образом (внутри метода ConfigureServices класса Startup).

            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<object, DataModel> для сопоставления базового класса и просто использовал жестко закодированные значения для дат, чувствуюВы можете свободно настраиваться в соответствии с вашим сценарием.

После внедрения экземпляра IMapper я смог успешно вызвать this.mapper.Map<Movie>(movie).

Надеюсь, это заставит вас двигаться в правильном направлении.

0 голосов
/ 28 декабря 2018

Вы можете попробовать Экземпляры профиля .

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

0 голосов
/ 27 декабря 2018

Вы можете указать, что AutoMapper не должен проверять соответствие всех свойств.Для этого можно использовать перечисление MemberList при создании конфигурации сопоставления.Например:

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

Ошибка на снимке экрана, однако, указывает, что другое сопоставление проблематично, то есть от MovieViewModel до MovieDto.Я предлагаю вам добавить конфигурацию сопоставления для этих типов:

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