Чтобы пропустить боль, перейдите к EDIT ниже.AutoMapper странное исключение проекции IQueryable
Я использую EF с AutoMapper IQueryableExtensions.
Два моих моделей следующим образом:
public class Article
{
public int Key { get; set; }
public DateTimeOffset Created { get; set; }
public int? SemesterKey { get; set; }
public virtual Semester Semester { get; set; }
}
public class Semester
{
public int Key { get; set; }
public string Name { get; set; }
public virtual ICollection<Article> Articles { get; set; }
// Other relationships
public virtual ICollection<Subject> Subjects { get; set; }
public virtual ICollection<AppUser> Users { get; set; }
}
И у меня есть следующие DTOs:
public class ArticleDto
{
public int Key { get; set; }
public DateTimeOffset Created { get; set; }
// If I remove this (or ignore it), everything works.
public SemesterDto Semester { get; set; }
}
public class SemesterDto
{
public int Key { get; set; }
public string Name { get; set; }
}
Конфигурация:
Mapper.CreateMap<Semester, SemesterDto>().MaxDepth(1);
Mapper.CreateMap<Article, ArticleDto>().MaxDepth(1);
Запрос:
context.Articles.Include(a => a.Semester)
.OrderByDescending(a => a.Created)
.Take(5)
.ProjectTo<ArticleDto>()
.ToList();
Выполнение запроса дает следующее странное исключение:
System.ArgumentException: Property 'NS.Models.Semester Semester' is not defined for type 'NS.Models.Semester'
Это некоторые из трассировки стека:
System.Linq.Expressions.Expression.Property(Expression expression, PropertyInfo property)
System.Linq.Expressions.Expression.MakeMemberAccess(Expression expression, MemberInfo member)
....
AutoMapper.MappingEngine.CreateMapExpression(ExpressionRequest request, Expression instanceParameter, IDictionary`2 typePairCount)
Кажется, как будто AutoMapper генерируется выражение, которое ищет Semester
собственности (в ответ на ArticleDto.Semester
похоже) на тип NS.Models.Semester
, которого, конечно, не существует. я могу заставить его работать, если я делаю следующее:
Mapper.CreateMap<Article, ArticleDto>().MaxDepth(1)
.ForMember(a => a.Semester, c => c.MapFrom(a => a.Semester == null ? null : new SemesterDto() {
Key = a.Semester.Key,
Year = a.Semester.Year }));
Но это только то, что я пытаюсь избежать писать с помощью AutoMapper!
Возможно, что-то не так с моей стороны, но я не могу найти ничего подозрительного.
EDIT:
У меня есть следующий ctors на SemesterDto:
public SemesterDto()
{
}
public SemesterDto(int key, string name)
{
Key = key;
Name = name;
}
Когда я удалить второе один все работает. Похоже, это правда, это действительно странное поведение. Я никогда не думал, что ctor сделает проблему, поэтому я не включил ее для ясности, возможно все, не так ли. Извини за это.
Итак, это ошибка от AutoMapper или есть что-то еще, что я неправильно понял?
EDIT 2:
Зачистка это больше, я попробовал отображение а Semester
к SemesterDto
непосредственно и это результат:
context.Semesters.ProjectTo<SemesterDto>().FirstOrDefault();
NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities.
Это укрепляет идею, что т е р вызывает странное поведение.
Какую версию вы используете AutoMapper? – silkfire
Последний, '4.0.4' – mrahhal
Выполняет ли' Project().() 'правильно работает? –