我已将我的应用程序升级到Ef Core 2.1,并且以前在EF 2.0中运行的查询现在出现错误。
我在多个不同的表中使用了相同查询的变体,而升级后它们都因相同的错误而失败
这是我的模特:
public class Promotion
{
public int PromotionId { get; set; }
// I've removed the other fields
public virtual ICollection<PromotionTopicJoin> PromotionTopicJoins {get; set;}
}
public class PromotionTopic
{
public int PromotionTopicId { get; set; }
[MaxLength(50)]
[Required]
public string Name { get; set; }
public virtual ICollection<PromotionTopicJoin> PromotionTopicJoins {get; set;}
}
public class PromotionTopicJoin
{
public int PromotionId { get; set; }
public Promotion Promotion { get; set; }
public int PromotionTopicId { get; set; }
public PromotionTopic PromotionTopic { get; set; }
}
这是我运行的查询:
return await _context.PromotionTopics
.Where(p => p.PromotionTopicId == TopicId)
.SelectMany(p => p.PromotionTopicJoins)
.Select(pc => pc.Promotion)
.Select(p => new PromotionDTO
{
PromotionId = p.PromotionId,
// I've removed all the other fields
Topics = p.PromotionTopicJoins.Select(itj => itj.PromotionTopic.Name).ToList()
})
.Where(x => x.Is_Active)
.OrderByDescending(x => x.Created)
.ToListAsync();
stacktrace很大,所以我只包括了错误和上一行。
System.InvalidOperationException:实体类型上的属性” 找不到“ PromotionTopicJoin”。确保财产 存在并已包含在模型中。在 Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.MemberAccessBindingExpressionVisitor.GetPropertyPath(Expression 表达式,QueryCompilationContext queryCompilationContext,输出 QuerySourceReferenceExpression querySourceReferenceExpression)
仅供参考,我的Microsoft.EntityFrameworkCore
和Microsoft.EntityFrameworkCore.SqlServer
版本从2.0.1升级到2.1.0
答案 0 :(得分:3)
不幸的是,这清楚地表明了EF Core查询翻译回归错误。
这样,您所能做的就是将其报告给EF Core Issue Tracker。提供相同的最小复制(删除.Where(x => x.Is_Active)
和.OrderByDescending(x => x.Created)
-它们当前不编译,但是问题重现了它们,并且也复制了ToList
,因此与异步无关)。
作为解决该问题的方法,直接从连接实体开始查询(问题似乎与SelectMany
导航有关):
return await _context.Set<PromotionTopicJoin>()
.Where(pc => pc.PromotionTopicId == TopicId)
.Select(pc => pc.Promotion)
.Select(p => new PromotionDTO
{
PromotionId = p.PromotionId,
// I've removed all the other fields
Topics = p.PromotionTopicJoins.Select(itj => itj.PromotionTopic.Name).ToList()
})
.Where(x => x.Is_Active)
.OrderByDescending(x => x.Created)
.ToListAsync();