自升级至EF 2.1

时间:2018-08-28 05:56:31

标签: c# asp.net-core entity-framework-core

我已将我的应用程序升级到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.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServer版本从2.0.1升级到2.1.0

1 个答案:

答案 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();