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

时间:2016-02-23 11:42:01

标签: c# sql linq entity-framework-core

目前,我正在开发一个Asp.Net Core网站并使用Entity Framework Core(目前是RC1)在开发机器上使用SQL Express LocalDB进行数据库访问,尽管测试服务器上的MS SQL也会出现同样的错误。 / p>

我遇到了一个问题,当查询多个级别的导航属性时,会生成无效的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; }
}

Context类中的DbSets

    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]      
    
  3. 由于查询确实选择了CarManufacturerId,因为实体SpeedingTicket的表上的列名[SpeedingTicket] AS [model]无效,查询会导致异常。

    我已尝试使用.Include()以及Fluent API,但两者都没有让我找到如何在此处正确使用Entity Framework Core来执行查询的解决方案。

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

    编辑以澄清:

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

1 个答案:

答案 0 :(得分:1)

据我了解,实体框架代码没有问题。Output of entity framework code。 但是在这里提到的Sql查询[model]是由实体框架创建的[SpeedingTickets]表。该表不包含任何列调用[CarManufacturerId]。这是错误。