Automapper: невозможно создать экземпляр абстрактного типа для коллекций - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь отобразить две сущности с отношением «многие ко многим», которые наследуются от абстрактного базового класса, в Dtos, которые также наследуют от своего собственного абстрактного базового класса. Когда я включаю отображение только для класса Essay , все работает нормально, за исключением того, что коллекция Books равна нулю, как только я добавляю отображение для этой коллекции, я получаю следующее исключение:

Внутреннее исключение 1: ArgumentException: невозможно создать экземпляр абстрактного типа Dtos.Dto`1 [System.Int64].

Рассмотрим следующий код:

namespace Entities
{
    public abstract class Entity<TId> : Entity
        where TId : struct, IEquatable<TId>
    {
        protected Entity()
        {
        }

        public TId Id { get; set; }
    }

    public class Essay : Entity<long>
    {
        public string Name { get; set; }
        public string Author { get; set; }

        public List<EssayBook> EssayBooks { get; set; }
    }

    public class Book : Entity<long>
    {
        public string BookName { get; set; }
        public string Publisher { get; set; }
        public List<EssayBook> EssayBooks { get; set; }
    }

    public class EssayBook
    {
        public long EssayId { get; set; }
        public long BookId { get; set; }
        public Essay Essay { get; set; }
        public Book Book { get; set; }
    }
}

namespace Dtos
{
    public abstract class Dto<TId>
       where TId : struct, IEquatable<TId>
    {
        protected Dto()
        {
        }

        public TId Id { get; set; }
    }

    public sealed class Essay : Dto<long>
    {
        public string Name { get; set; }
        public string Author { get; set; }

        public List<Book> Books { get; set; }
    }

    public class Book : Dto<long>
    {
        public string BookName { get; set; }
        public string Publisher { get; set; }
    }
}

namespace DtoMapping
{
    internal sealed class EssayBookProfile : Profile
    {
        public EssayBookProfile()
        {
            this.CreateMap<Entities.Essay, Dtos.Essay>()
                .IncludeBase<Entities.Entity<long>, Dtos.Dto<long>>()
                .ForMember(dto => dto.Books, opt => opt.MapFrom(e => e.EssayBooks.Select(pl => pl.Book)));
        }
    }
}

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

В свой проект веб-API я включил пакет AutoMapper.Extensions.Microsoft.DependendyInjection версия 7.0.0 .

1 Ответ

0 голосов
/ 11 ноября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...