直接执行存储命令

使用实体框架 ,可以直接执行任意数据源命令。

如果存在当前事务,则将在当前事务的上下文中执行存储命令。 如果在调用以下方法之一前未打开通过 ObjectContext 实现的连接,则实体框架 将在执行查询前打开该连接,然后在查询执行完成后关闭该连接。 有关查询执行的信息,请参见对象查询(实体框架)。 下面的方法属于 ObjectContext 类型,有关如何使用这些方法的示例,请参见如何:直接对数据源执行命令

使结果类型具体化

对于采用泛型结果类型参数的上述方法,TResult 可以为基元类型、实体类型或者任何自定义类型。 并非一定要在实体框架 概念模型中定义类型。 如果指定的类型在概念模型中未定义,或者指定的类型不是基元类型,则将应用以下映射约定。

类型:

  • 不能为抽象类型。

  • 必须具有默认的构造函数。

类型的每个属性:

  • 必须具有 Setter。

  • 必须与 CSDL 中的基元类型相对应。

  • 必须与生成的 DbDataReader 中的列名称相对应(提供程序实现决定列是否与属性具有相同的名称)。 如果类型的属性名称与 DbDataReader 的字段不匹配,则实体框架 会将该属性的默认值(如果在概念模型中进行了定义)具体化。

使用参数化命令

使用参数化命令可帮助抵御 SQL 注入攻击,这种攻击会将命令“注入”SQL 语句中,从而危及服务器的安全。 通过确保将从外部源接收的值仅作为值(而不是作为 SQL 语句的一部分)进行传递,参数化命令可抵御 SQL 注入攻击。 这样,便不会在数据源中执行插入到值中的 SQL命令了。 相反,只会将这些命令作为参数值来计算。 除具备安全优势外,参数化命令还提供一种便捷的方法来组织随 SQL语句传递或传递到存储过程的值。

在调用 ExecuteStoreCommand 方法或 ExecuteQuery 重载之一(ExecuteStoreQueryExecuteStoreQuery)并传递 commandTextparameters 参数时,实体框架 将使用当前对象上下文连接生成一个新的 DbCommand 实例,并将 CommandText ** 属性设置为 commandText,同时将 Parameters 属性设置为 parametersparameters 值可以是 DbParameter 对象数组或参数值数组。 如果只提供了值,将根据数组中值的顺序创建 DbParameter 对象数组。 基础提供程序根据公共语言运行时 (CLR) 类型确定参数对象的适当 DbType。 各个参数对象的 ParameterName 使用以下模式生成:“pn”,其中 n 为参数自变量的序号,序号从零开始。

例如,以下两种方法调用是等效的:

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

另请参见

任务

如何:直接对数据源执行命令