【发布时间】:2015-10-15 18:02:42
【问题描述】:
要跳过痛苦,请转到下面的编辑。
我正在使用带有 AutoMapper IQueryableExtensions 的 EF。
我的两个模型如下:
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.
这强化了 ctor 导致奇怪行为的想法。
【问题讨论】:
-
你用的是什么版本的AutoMapper?
-
Project().To<ArticleDto>()工作正常吗? -
同样的结果,同样的事情。
-
我无法复制这个。也许你应该展示更多细节,这样我们可能会看到你自己忽略的问题。
-
我制作了一些轻量级模型仅用于测试并且映射工作正常。现在我正试图排除导致此失败的差异。
标签: asp.net-mvc entity-framework automapper