實體框架核心 - LINQ選擇導航屬性會創建無效查詢

c# entity-framework-core linq sql

目前,我正在開發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; }
}

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]      
    

由於查詢確實選擇[SpeedingTicket] AS [model] ,因此查詢會導致CarManufacturerId SpeedingTicket的表上的列名稱CarManufacturerId無效,從而導致異常。

我已經嘗試過.Include()以及Fluent API,但兩者都沒有讓我找到如何正確使用Entity Framework Core來執行查詢的解決方案。

異常消息本身表明我的模型和數據庫不同步,我應該創建一個新的遷移,但實際上它們是同步的。我想這個建議來自EF,假設在找不到列時數據庫模式不匹配。

編輯以澄清:

這個問題的目的是找出我的設置中是否存在錯誤(比如缺少使用Fluent API的配置),或者它是否仍然是當前版本的Entity Framework Core中的錯誤。 @Ivan Stoev確實指出它是後者,這是當前Entity Framework代碼中的一個錯誤。

熱門答案

據我了解,實體框架代碼沒有問題。 實體框架代碼的輸出 。但是在這裡提到的Sql查詢[model]是由實體框架創建的[SpeedingTickets]表。該表不包含任何列調用[CarManufacturerId]。這是錯誤。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因