次の方法で共有


Entity Framework 用 SqlClient の既知の問題

このセクションでは、.NET Framework Data Provider for SQL Server (SqlClient) に関連する既知の問題について説明します。

文字列関数の末尾のスペース

SQL Server では、文字列値の末尾のスペースは無視されます。 そのため、文字列内で末尾のスペースを渡すと、予期しない結果になり、エラーが発生する可能性があります。

文字列内に末尾のスペースが必要な場合は、SQL Server が文字列をトリミングしないように、末尾に空白文字を追加することを検討する必要があります。 末尾のスペースが必要ない場合は、クエリ パイプラインに渡される前にトリミングする必要があります。

RIGHT 関数

null以外の値が最初の引数として渡され、0 が 2 番目の引数として RIGHT(nvarchar(max)、0、)、または RIGHT(varchar(max)、0) に渡された場合、empty文字列の代わりにNULL値が返されます。

CROSS および OUTER APPLY 演算子

CROSS および OUTER APPLY 演算子は、SQL Server 2005 で導入されました。 場合によっては、クエリ パイプラインによって、CROSS APPLY 演算子や OUTER APPLY 演算子を含む Transact-SQL ステートメントが生成されることがあります。 SQL Server 2005 より前のバージョンの SQL Server を含む一部のバックエンド プロバイダーは、これらの演算子をサポートしていないため、このようなクエリをこれらのバックエンド プロバイダーで実行することはできません。

出力クエリに CROSS APPLY 演算子や OUTER APPLY 演算子が存在する一般的なシナリオを次に示します。

  • ページングを使用した相関サブクエリ。

  • 関連付けられたサブクエリ、またはナビゲーションによって生成されたコレクションに対する AnyElement

  • 要素セレクターを受け入れるグループ化メソッドを使用する LINQ クエリ。

  • CROSS APPLY または OUTER APPLY が明示的に指定されているクエリ

  • REF コンストラクトに対する DEREF コンストラクトを持つクエリ。

SKIP 演算子

SQL Server 2000 を使用している場合、キー以外の列で SKIP と ORDER BY を使用すると、正しくない結果が返される可能性があります。 キー以外の列に重複するデータがある場合、指定した数を超える行がスキップされる可能性があります。 これは、SQL Server 2000 の SKIP の変換方法が原因です。 たとえば、次のクエリでは、 E.NonKeyColumn に重複する値がある場合、5 行を超える行がスキップされることがあります。

SELECT [E] FROM Container.EntitySet AS [E] ORDER BY [E].[NonKeyColumn] DESC SKIP 5L  

正しい SQL Server バージョンを対象とする

Entity Framework は、ストレージ モデル (.ssdl) ファイルの Schema 要素の ProviderManifestToken 属性で指定されている SQL Server バージョンに基づいて、Transact-SQL クエリを対象とします。 このバージョンは、接続先の実際の SQL Server のバージョンとは異なる場合があります。 たとえば、SQL Server 2005 を使用しているが、 ProviderManifestToken 属性が 2008 に設定されている場合、生成された Transact-SQL クエリがサーバーで実行されない可能性があります。 たとえば、SQL Server 2008 で導入された新しい日付/時刻型を使用するクエリは、以前のバージョンの SQL Server では実行されません。 SQL Server 2005 を使用しているが、 ProviderManifestToken 属性が 2000 に設定されている場合、生成された Transact-SQL クエリの最適化が低下したり、クエリがサポートされていないことを示す例外が発生したりする可能性があります。 詳細については、このトピックの「CROSS および OUTER APPLY Operators」セクションを参照してください。

特定のデータベース動作は、データベースに設定されている互換性レベルによって異なります。 ProviderManifestToken属性が 2005 に設定されていて、SQL Server のバージョンが 2005 で、データベースの互換性レベルが "80" (SQL Server 2000) に設定されている場合、生成された Transact-SQL は SQL Server 2005 を対象としますが、互換性レベルの設定により期待どおりに実行されない可能性があります。 たとえば、ORDER BY リストの列名がセレクターの列名と一致すると、順序情報が失われる可能性があります。

プロジェクション内のネストクエリ

プロジェクション句の入れ子になったクエリは、サーバー上のデカルト積クエリに変換される場合があります。 SQL Server を含む一部のバックエンド サーバーでは、TempDB テーブルが非常に大きくなる可能性があります。 これにより、サーバーのパフォーマンスが低下する可能性があります。

プロジェクション句の入れ子になったクエリの例を次に示します。

SELECT c, (SELECT c, (SELECT c FROM AdventureWorksModel.Vendor AS c  ) As Inner2 FROM AdventureWorksModel.JobCandidate AS c  ) As Inner1 FROM AdventureWorksModel.EmployeeDepartmentHistory AS c  

サーバーによって生成された GUID ID 値

Entity Framework では、サーバーによって生成される GUID 型の ID 値がサポートされますが、プロバイダーは、行が挿入された後にサーバーによって生成された ID 値の返しをサポートする必要があります。 SQL Server 2005 以降では、 OUTPUT 句を使用して、SQL Server データベースでサーバーによって生成された GUID 型を返すことができます。

こちらも参照ください