要跳過痛苦,請轉到編輯下面。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; }
}
而且我有以下的DTO:
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避免寫的東西!
這可能是我的錯,但我找不到任何可疑的東西。
編輯:
我有SemesterDto以下構造函數:
public SemesterDto()
{
}
public SemesterDto(int key, string name)
{
Key = key;
Name = name;
}
當我刪除第二個一切正常。似乎是這樣,但這真是奇怪的行爲。我從來沒有想過ctor會出問題,所以我沒有把它包括進去,但一切皆有可能。對於那個很抱歉。
那麼,這是一個來自AutoMapper的錯誤還是有其他我誤解?
編輯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
'項目()。到()'工作正常嗎? –