Share via


Ejecutar directamente los comandos de almacenamiento

Con Entity Framework , puede ejecutar los comandos de origen de datos arbitrarios directamente.

El comando de almacenamiento se ejecuta en el contexto de la transacción actual, si esa transacción existe. Si la conexión a través del ObjectContext no está abierta antes de la llamada a uno de los siguientes métodos, Entity Framework abrirá la conexión antes de ejecutar la consulta y, a continuación, cerrará la conexión después de que finalice la ejecución de la consulta. Para obtener información acerca de la ejecución de consultas, vea Consultas de objeto (Entity Framework). Los siguientes métodos pertenecen al tipo ObjectContext; para obtener ejemplos sobre cómo utilizar los métodos, vea Cómo: Ejecutar directamente comandos contra el origen de datos.

Materializar el tipo del resultado

Para los métodos anteriores que toman un parámetro de tipo de resultado genérico, TResult puede ser un tipo primitivo, un tipo de entidad o cualquier tipo personalizado. El tipo no tiene que ser definido en el modelo conceptual de Entity Framework . Si el tipo especificado es de un tipo que no se define en el modelo conceptual o no es un tipo primitivo, se aplican las siguientes convenciones de asignación.

El tipo:

  • No debe ser abstracto.

  • Debe tener un constructor predeterminado.

Cada propiedad del tipo:

  • Debe tener un establecedor.

  • Debe corresponder a un tipo primitivo de CSDL.

  • Debe corresponder a un nombre de columna en el DbDataReader resultante (la implementación del proveedor determina si una columna tiene el mismo nombre que la propiedad). Si el nombre de la propiedad del tipo no coincide con un campo del DbDataReader, Entity Framework materializa el valor predeterminado de la propiedad si está definido en el modelo conceptual.

Trabajar con comandos con parámetros

Los comandos con parámetros ayudan en la protección contra inyección de código SQL, que consiste en ataques en los que se "inyecta" un comando en una instrucción SQL que pone en peligro la seguridad del servidor. Los comandos con parámetros protegen de ataques por inyección de código SQL ya que garantizan que los valores recibidos desde un origen externo pasan solo como valores y no como parte de la instrucción SQL. Como resultado, los comandosSQL insertados en un valor no se ejecutan en el origen de datos. En cambio, se evalúan únicamente como un valor de parámetro. Además de las ventajas en el aspecto de la seguridad, los comandos con parámetros proporcionan un método práctico para organizar los valores que se pasan con una instrucciónSQL a un procedimiento almacenado.

Al llamar al método ExecuteStoreCommand o a una de las sobrecargas de ExecuteQuery (ExecuteStoreQuery o ExecuteStoreQuery) y pasar los argumentos commandText y parameters, Entity Framework genera una nueva instancia de DbCommand utilizando la conexión del contexto de objetos actual y establece la propiedad CommandText ** en commandText y la propiedad Parameters en parameters. El valor parameters puede ser una matriz de objetos DbParameter o una matriz de valores de parámetro. Si solo se proporcionan los valores, se crea una matriz de objetos DbParameter basada en el orden de los valores de la matriz. El proveedor subyacente determina el DbType adecuado para el objeto de parámetro, según el tipo de Common Language Runtime (CLR). El ParameterName para cada objeto de parámetro se compila utilizando el siguiente modelo: "pn" donde n es el ordinal, con inicio en cero, del argumento del parámetro.

Por ejemplo, las dos llamadas a métodos siguientes son equivalentes:

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 });

Vea también

Tareas

Cómo: Ejecutar directamente comandos contra el origen de datos