2016-02-23 62 views
2

目前,我正在開發一臺Asp.Net Core網站,並使用實體框架核心(目前是RC1)在開發機器上使用SQL Express LocalDB進行數據庫訪問,儘管測試服務器上的MS SQL提供相同的錯誤。實體框架核心 - LINQ選擇導航屬性創建無效查詢

我遇到了一個問題,當查詢多個級別的導航屬性時,將生成無效的SQL。我創建了下面的測試代碼來重現問題:

4類表示數據庫表中的Context類

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; } 
} 

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

哪個doe的兩個東西:

  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進行了實驗,但都沒有找到我如何正確使用Entity Framework Core來執行查詢的解決方案。

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

編輯澄清:

問題的目的是找出這是否是我的設置錯誤(如缺少用流利的API配置),或者如果它仍然在實體框架的當前版本中的錯誤核心。 @Ivan Stoev確實指出它是後者,是當前實體框架代碼中的一個錯誤。

+1

問題是...?其實沒關係。你的LINQ查詢是正確的,所以顯然這個問題在EF7中。它還沒有發佈,所以這是正常的錯誤,你最好不要浪費你的時間使用(測試)非生產代碼。 –

+0

你沒有回答我的問題。我想知道是否存在我身邊的錯誤,或者是否與實體框架的當前狀態一致。 – GeorgDangl

回答

1

據我所知,實體框架代碼沒有問題。​​。 但是在這裏提到的Sql query [model]是由實體框架創建的[SpeedingTickets]表。該表不包含任何列調用[CarManufacturerId]。那就是錯誤。

+0

感謝您的回答,這也表明這是查詢從LINQ轉換爲SQL的錯誤。但是,我寧願接受一個答案,提供有關查詢錯誤的原因的詳細信息(以及可能的解決方法)。 – GeorgDangl