Entity Frameworkコア - LINQ上のナビゲーションプロパティの選択で無効なクエリが作成される

c# entity-framework-core linq sql

質問

現在、私はAsp.Net Core Webサイトで作業していますが、テストサーバー上のMS SQLは同じエラーを返しますが、開発マシンでSQL Express LocalDBを使用してEntity Framework Core(現RC1)を使用しています。

私は、複数のレベルのナビゲーションプロパティを照会するときに無効な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();

どちらが2つのことか:

  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]選択するので、エンティティSpeedingTicketのテーブルの無効な列名CarManufacturerIdために、クエリで例外が発生します。

Fluent APIと同様に.Include().Include()ましたが、Entity Framework Coreをここで正しく使用してクエリを実行する方法については、どちらも解決策にはなりませんでした。

例外メッセージ自体は、私のモデルとデータベースが同期していないことを示唆しています。新しい移行を作成する必要がありますが、実際は同期しています。私は、この提案は、列が見つからないときにデータベースのスキーマが不一致であると仮定してEFから来ると思います。

解明のために編集:

質問の目的は、これが私のセットアップ(Fluent APIの設定が欠けているようなもの)であるのか、それとも現在のバージョンのEntity Framework Coreのバグであるのかを調べることでした。 @Ivan StoevはEntity Frameworkの現行コードのバグであることを指摘しました。

人気のある回答

私が理解するように、エンティティフレームワークコードには問題はありません。 エンティティフレームワークコードの出力 。しかし、ここで言及SQLクエリ[モデル]は、[SpeedingTickets]テーブルがエンティティフレームワークによって作成されます。そのテーブルには列呼び出し[CarManufacturerId]が含まれていません。エラーです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ