Share via


ストア コマンドの直接実行

Entity Framework を使用すると、任意のデータ ソース コマンドを直接実行できます。

現在トランザクションを実行している場合は、そのトランザクションのコンテキストで格納コマンドが実行されます。 次のいずれかのメソッドを呼び出す前に、ObjectContext を経由した接続が開いていなかった場合、Entity Framework によってクエリの実行前に接続が開かれ、クエリの実行が完了した後で接続が閉じられます。 クエリの実行については、「オブジェクト クエリ (Entity Framework)」を参照してください。 以下の各メソッドは、ObjectContext 型に属しています。具体的なメソッドの使用例については、「方法: データ ソースに対してコマンドを直接実行する」を参照してください。

結果型の具体化

ジェネリック結果型パラメーターを取る以前のメソッドでは、TResult はプリミティブ型、エンティティ型、またはカスタム型のいずれかになります。 型を Entity Framework 概念モデルで定義する必要はありません。 指定された型が概念モデルで定義されていない型であるか、プリミティブ型でない場合は、次のマッピング規則が適用されます。

型:

  • 抽象以外でなければならない。

  • 既定のコンストラクターを持っている必要がある。

型の各プロパティ:

  • setter を持っている必要がある。

  • CSDL のプリミティブ型に対応している必要がある。

  • 結果の DbDataReader 列名に対応している必要がある (プロバイダーの実装により、列にプロパティと同じ名前が付いているかどうかが判断されます)。 型のプロパティ名が DbDataReader のフィールドに一致しない場合、Entity Framework では概念モデルに定義されているプロパティの既定値を具体化します。

パラメーター化コマンドの使用

パラメーター化コマンドは SQL インジェクション攻撃への対策として利用できます。SQL インジェクション攻撃は、コマンドを SQL ステートメントに "注入" し、サーバーのセキュリティを侵害することによって行われます。 パラメーター化コマンドを使用した場合、外部ソースから受け取る値は、SQL ステートメントの一部としてではなく、値としてのみ渡されることが保証されるため、SQL インジェクション攻撃を防ぐことができます。 その結果、SQLコマンドが値に挿入されたとしても、データ ソースに対して実行されることはありません。 これらはパラメーター値としてのみ処理されます。 セキュリティ面の利点に加え、パラメーター化コマンドには、SQLステートメントで渡される値やストアド プロシージャに渡される値を簡単に扱うことができるという利点もあります。

ExecuteStoreCommand メソッドまたは ExecuteQuery オーバーロード (ExecuteStoreQuery または ExecuteStoreQuery) のいずれかを呼び出して commandText 引数と parameters 引数を渡すと、Entity Framework によって、新しい DbCommand インスタンスが生成されます。これは、現在のオブジェクト コンテキスト接続を使用し、CommandText ** プロパティを commandText に設定し、Parameters プロパティを parameters に設定することで行われます。 parameters の値には、DbParameter オブジェクトの配列か、パラメーター値の配列を使用できます。 値のみが指定されている場合は、DbParameter オブジェクトの配列が配列内の値の順序に基づいて作成されます。 基になるプロバイダーは、共通言語ランタイム (CLR) 型に基づいて、パラメーター オブジェクトに適した DbType を判断します。 各パラメーター オブジェクトの ParameterName は、"pn" のパターンを使用して構築されます。ここで n は、パラメーター引数の、0 から始まる序数です。

たとえば、次の 2 つのメソッドの呼び出しは同等です。

context.ExecuteStoreQuery<Product>("select * from Products where pid = {0}", 1);

context.ExecuteStoreQuery<Product>("select * from Products where pid = @p0", new SqlParameter { ParameterName = "p0", Value = 1 });

参照

処理手順

方法: データ ソースに対してコマンドを直接実行する