目前,我正在開發一臺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的兩個東西:
- 創建一個單一的查詢檢索所有制造商ID和名稱
查詢所有與以下,無效的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確實指出它是後者,是當前實體框架代碼中的一個錯誤。
問題是...?其實沒關係。你的LINQ查詢是正確的,所以顯然這個問題在EF7中。它還沒有發佈,所以這是正常的錯誤,你最好不要浪費你的時間使用(測試)非生產代碼。 –
你沒有回答我的問題。我想知道是否存在我身邊的錯誤,或者是否與實體框架的當前狀態一致。 – GeorgDangl