Automapper: отображение коллекции на один объект через проекцию - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть набор классов.

public class Student
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }
    public virtual ICollection<ScoreRecord> ScoreRecords { get; set; }
}

public class ScoreRecord
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int StudentId { get; set; }
    public virtual Student Student { get; set; }
    public string Subject { get; set; }
    public int Score { get; set; }
}

public class ScoreModel
{
    public int MinScore { get; set; }
    public int MaxScore { get; set; }
}

public class StudentViewModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ScoreModel Score { get; set; }
}

Мне нужно выполнить это отображение:

Mapper.CreateMap<Student, StudentViewModel>()
    .ForMember(d => d.Score, opts => opts.MapFrom(m => m.ScoreRecords));
Mapper.CreateMap<ICollection<ScoreRecord>, ScoreModel>()
    .ForMember(d => d.MinScore, opts => opts.MapFrom(m => m.Min(s => s.Score)))
    .ForMember(d => d.MaxScore, opts => opts.MapFrom(m => m.Max(s => s.Score)));

Следующий код вызывает исключение:

var student = context.Students.ProjectTo<StudentViewModel>().FirstOrDefault(e => e.Id == 1);

Информация об исключении:

Произошло необработанное исключение типа 'System.NotSupportedException' в EntityFramework.SqlServer.dll Дополнительная информация: Невозможно сравнить элементы типа 'System.Collections.Generic.ICollection`1 [[EFTest.Entities.ScoreRecord, EFTest, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль]] '. Только поддерживаются примитивные типы, типы перечисления и типы объектов.

Если я не использую проекцию, то отображение работает правильно. Следующий код выполняется без ошибок.

var student = ctx.Students.FirstOrDefault(e => e.Id == 1);
var studentViewModel = Mapper.Map<StudentViewModel>(student);

Почему не удается сопоставить с проекцией и как это исправить?

Automapper version: 4.0.4, версия EntityFramework: 6.1

1 Ответ

1 голос
/ 04 апреля 2019

Это из-за нулевой проверки, которая происходит, когда у вас есть карта для свойства.Проверьте план выполнения .

. Этого можно избежать, установив для параметра AllowNullDestinationValues ​​значение false (глобально или для каждого профиля).Или вы можете обновить и установить AllowNull для каждого участника.

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