5

MySQL で Entity Framework を使用しています。次のクエリはエラーになります。

var foobar = ctx.ArticleBase.OfType<ActicleSpecial>().Include("CreatedBy.Image.Location").ToList();

エラー: "OUTER APPLY is not supported by MySQL" 少し異なるクエリで "CROSS APPLY is not supported by MySQL" も取得します。

次のデータモデルがあります。 代替テキスト

Image エンティティには Location 関係という名前の Location エンティティ (1 対多の関係) があり、UserBase には UserSpecial ではなく Image 関係があります。

なぜこのエラーが発生するのですか? このエラーを回避するにはどうすればよいですか? 出来ますか?

4

2 に答える 2

3

このエラーが MySQL から発生している場合は、次の 2 つのいずれかが発生しています。

  1. プロバイダーが正しく構成されていません。
  2. EF プロバイダーにバグがあります。

このエラーが MySQL EF プロバイダーから発生している場合は、次の 2 つのいずれかが発生しています。

  1. プロバイダーが正しく構成されていません。
  2. EF プロバイダーには制限があります。

SQL はプロバイダーによって生成されます。EDMXの ProviderManifestToken 属性を使用して、サーバー バージョン固有の SQL 生成を構成できます。これは、古いサーバー バージョンがサポートしていない SQL 機能を使用しないようにプロバイダーに指示する方法です。

一部の MySQL ストレージ エンジンは SQL 機能をサポートしていますが、他のストレージ エンジンはサポートしていない可能性があります。この場合、プロバイダーは、ほとんどのエンジンでサポートされている共通の機能サブセットを使用するか、ユーザーProviderManifestTokenが選択できるようにする必要があります。

ただし、バグのあるプロバイダーが単に間違った SQL を返す可能性もあります。この場合、更新を見つけるか、バグに関係するクエリを避ける必要があります。

更新: @Devart の回答に基づくと、これはプロバイダーの制限であり、MySQL の制限のために設計されているようです。EF は、ADO.NET 標準コマンド ツリーを生成します。これを SQL に変換するのはプロバイダーの責任です。EF が CCT でクロス/外部適用ノードを返す場合、Devart はこれを MySQL が処理できる SQL に変換する方法を見つけていないようです。したがって、MySQL はすべての EF クエリをサポートするタスクに対応していないか、MySQL の専門家 (私ではありません!) がクロス/アウター適用の行を適切に返すことができる MySQL 互換 SQL を生成する方法を Devart に示す必要があります。 CCT ノード。

于 2010-02-25T13:56:40.713 に答える
3

これは、Entity Framework の内部アーキテクチャ機能です。場合によっては、SQL Server 以外のプロバイダーでサポートされていないクエリが生成されることがあります。詳細については、MSDN を参照してください。

于 2010-02-25T14:29:05.437 に答える