目前,我正在开发一个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();
这有两件事:
使用以下无效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]
由于查询确实选择了CarManufacturerId
,因为实体SpeedingTicket
的表上的列名[SpeedingTicket] AS [model]
无效,查询会导致异常。
我已尝试使用.Include()
以及Fluent API,但两者都没有让我找到如何在此处正确使用Entity Framework Core来执行查询的解决方案。
异常消息本身表明我的模型和数据库不同步,我应该创建一个新的迁移,但实际上它们是同步的。我想这个建议来自EF,假设在找不到列时数据库模式不匹配。
编辑以澄清:
问题的目的是找出我的设置中是否存在错误(比如缺少Fluent API的配置),或者它是否仍然是当前版本的Entity Framework Core中的错误。 @Ivan Stoev确实指出它是后者,这是当前实体框架代码中的一个错误。
答案 0 :(得分:1)
据我了解,实体框架代码没有问题。Output of entity framework code。 但是在这里提到的Sql查询[model]是由实体框架创建的[SpeedingTickets]表。该表不包含任何列调用[CarManufacturerId]。这是错误。