实体框架核心 - LINQ 选择导航属性会创建无效查询

本文关键字:属性 创建 无效 查询 导航 选择 框架 核心 LINQ 实体 | 更新日期: 2023-09-27 18:35:53

目前,我正在开发一个 Asp.Net Core网站,并使用Entity Framework Core(当前为RC1)在开发计算机上使用SQL Express LocalDB进行数据库访问,尽管测试服务器上的MS SQL给出了相同的错误。

我遇到了一个问题,即在查询多个级别的导航属性时,会生成无效的 SQL。我创建了以下测试代码来重现该问题:

4 表示数据库表的类

public class CarManufacturer
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<CarModel> CarModels { get; set; }
}
public class CarModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid CarManufacturerId { get; set; }
    public CarManufacturer CarManufacturer { get; set; }
    public List<CarTestDriver> CarTestDrivers { get; set; }
}
public class CarTestDriver
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid CarModelId { get; set; }
    public CarModel CarModel { get; set; }
    public List<SpeedingTicket> SpeedingTickets { get; set; }
}
public class SpeedingTicket
{
    public Guid Id { get; set; }
    public decimal Amount { get; set; }
    public Guid CarTestDriverId { get; set; }
    public CarTestDriver CarTestDriver { get; set; }
}

上下文类中的数据库集

    public DbSet<CarManufacturer> CarManufacturers { get; set; }
    public DbSet<CarModel> CarModels { get; set; }
    public DbSet<CarTestDriver> CarTestDrivers { get; set; }
    public DbSet<SpeedingTicket> SpeedingTickets { get; set; }

现在,我创建一个 linq 查询,为我提供按制造商排序的票证总数

        var ticketCostByManufacturers = Context.CarManufacturers
            .Select(manufacturer => new
            {
                manufacturer.Name,
                TotalTicketAmount = manufacturer.CarModels.SelectMany(model => model.CarTestDrivers).SelectMany(driver => driver.SpeedingTickets).Sum(ticket => ticket.Amount)
            })
            .ToList();

它做了两件事:

  1. 创建单个查询以检索所有制造商 ID 和名称
  2. 使用以下无效 SQL 查询所有票证:(仅当第一个查询产生结果时)

    SELECT [model].[Id],
    [model].[Amount],
    [model].[CarTestDriverId],
    [model].[CarManufacturerId], -- Invalid Column
    [model].[Id],
    [driver].[Id],
    [ticket].[Amount]
    FROM [SpeedingTicket] AS [model]
    CROSS JOIN [CarTestDriver] AS [driver]
    CROSS JOIN [SpeedingTicket] AS [ticket]      
    

由于实体SpeedingTicket的表上CarManufacturerId列名无效,查询会导致异常,因为查询确实选择了[SpeedingTicket] AS [model]

我已经尝试了.Include()和 Fluent API,但两者都没有让我找到有关如何在此处正确使用实体框架核心来执行查询的解决方案。

异常消息本身表明我的模型和数据库不同步,我应该创建一个新的迁移,但实际上它们是同步的。我想这个建议来自 EF 假设在找不到列时数据库架构不匹配。

编辑澄清:

该问题的目的是找出这是否是我的设置中的错误(例如缺少 Fluent API 的配置),或者它是否仍然是当前版本的实体框架核心中的错误。 @Ivan Stoev确实指出这是后者,是实体框架当前代码中的一个错误。

实体框架核心 - LINQ 选择导航属性会创建无效查询

我了解,实体框架代码没有问题。实体框架代码的输出。但是在SQL查询[模型]中提到的是由实体框架创建的[SpeedingTickets]表。该表不包含任何列调用 [CarManufacturerId]。这就是错误。