`

<Entity Framework> - 直接执行数据库命令

 
阅读更多

使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库命令. 在本节介绍的方法允许你对数据库执行原生的 SQL 命令.

 

通过 SQL 查询语句获取实体对象集

DbSet 类中的 SqlQuery 方法允许你执行一个返回实体对象集的原生 SQL 查询. 默认情况下, 返回的对象集会被上下文跟踪; 这可以通过对方法返回的 DbSqlQuery 对象调用 AsNoTracking 方法取消.返回的结果集一般为 DbSet 所对应的类型, 否则即便是其派生类也无法返回. 如果所查询的表包含了其他实体类型的数据, 那么所执行的 SQL 语句应该被正确书写, 保证只返回指定类型实体的数据. 下面的例子使用 SqlQuery 方法执行了一个 SQL 查询, 返回一个 Department 类型的实例集.

using (var context = new SchoolEntities()) 
 { 
     var departments = context.Departments.SqlQuery( 
                     "select * from Department").ToList(); 
 }

 

译注: AsNoTracking 方法必须再查询执行前调用, 查询执行后调用无效.

通过 SQL 查询获取非实体对象集

通过 Database 类中的 SqlQuery 方法来执行原生 SQL 命令, 可以返回任何类型的实例, 包括 .Net 中的原生类型. 但获取的数据将不会被上下文对象跟踪, 即使我们用这个方法来检索实体对象. 如:

using (var context = new SchoolEntities()) 
{ 
     var names = context.Database.SqlQuery<string>("select Name from Department").ToList(); 
 } 

 

让数据库执行原生的非查询 SQL 命令

可以通过 Database 类中的 ExecuteSqlCommand 方法执行非查询命令. 例如:

using (var context = new SchoolEntities()) 
{ 
     context.Database.ExecuteSqlCommand("update Department set Name = 'Mathematics' where Name = 'Math'"); 
}

 

ExecuteSqlCommand 方法有时会被用在 Code First 创建的数据库的初始化函数中, 用来对数据库进行一些额外的配置 (例如, 设置索引). 需要注意的是, 上下文对象并不知道执行了 ExecuteSqlCommand 方法后数据库中的数据有什么改变, 除非你从数据库中载入或重新载入实体集.

调用存储过程

Code First 并不支持对存储过程的映射. 但是, 你可以通过 ExecuteSqlCommand 或 SqlQuery 方法直接调用存储过程. 例如: context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").

译注: 本文提到的三个方法 (DbSet.SqlQuery, Database.SqlQuery, Database.ExecuteSqlCommand) 都支持参数化查询, 用法和 string.Format 类似, 但是在查询执行时会对传入的参数进行类型转换. 如: context.Departments.SqlQuery("select * from Department where DepartmentID = {0}", "6"); 该语句执行时, 会将字符串 "6" 转化为整数然后再代入查询语句中执行, 可以有效防止 SQL 注入.

防止 SQL 注入攻击

应用程序经常要从外部获取输入 (来自用户和其他外部代理) , 然后根据这些输入执行相关操作. 从用户或外部代理直接或间接获取的任何信息都可能利用目标程序语言的语法来执行违法操作. 当目标语言是结构化查询语言 (SQL) 时, 例如 Transact-SQL, 这个操作被称为 SQL 注入攻击. 恶意的用户可以直接在查询中注入命令执行操作, 删除数据库中的一个表, 拒绝提供服务或修改正在执行的操作的性质. 故你应该使用参数化的查询, 而不是直接将从外部获取的字符串插入到查询字符串中.

分享到:
评论

相关推荐

    matlab最简单的代码-TimeSystem:定时执行系统

    EntityFramework 用于从数据库读取任务 Microsoft.AspNet.WebApi.SelfHost (已弃用) 用于提供数据接口 Quartz 定时任务 Topshelf 用于编写易于调试易于安装的windows服务 csredis 用于查询任务的执行状态 项目说明...

    EfMigrationModelDecoder:从Entity Framework Code First迁移中解码模型的实用程序,以EDMX文件形式存储在__MigrationHistory中

    执行“添加-迁移”命令时,实体框架代码优先使用该模型生成迁移代码。 查看数据库中存储了什么模型以调试迁移的一些困难问题可能很有用,即在合并两个都有新迁移的分支之后。 EDMX 文件可以用 Visual Studio 打开。...

    sample-dotnet-core-cqrs-api:使用Clean Architecture的具有原始SQL和DDD的示例.NET Core REST API CQRS实现

    读取模型-在数据库视图对象上执行原始SQL脚本(使用 )。 编写模型-域驱动设计方法(使用Entity Framework Core)。 使用库处理命令/查询/域事件。 域 验证方式 使用数据验证 使用HTTP API标准实现的问题详细信息...

    EntityFramework数据持久化 第四章 EF的高级使用

    1)ExecuteSqlCommand()不返回结果、只返回受影响的行数,适用于执行创建、插入、更新、删除操作(即执行给定的DDL/DML命令)。 2)SqlQuery()返回查询到的结果、并将结果保存在数据实体中,适用于执行查询操作。 二...

    iuhyiuhkjh908u0980

    default:需要的缺省任务(运行"ant"不指明任务时执行的任务) --&gt; &lt;project name="WebTest" defa ... by duzn 2007-04-02 回复 (0) Antenna与j2me打包 Antenna与j2me打包 众所周知,j2me平台受限于各厂商对KVM的实现...

    EFCoreSecondLevelCacheInterceptor:EF核心二级缓存拦截器

    EF命令的结果将存储在缓存中,以便相同的EF命令将从缓存中检索其数据,而不是再次对数据库执行它们。通过NuGet安装要安装EFCoreSecondLevelCacheInterceptor,请在程序包管理器控制台中运行以下命令:PM &gt; Install-...

    整理后java开发全套达内学习笔记(含练习)

    byte &gt; short &gt; int &gt; long &gt; float &gt; double char 」 注意:默认类型转换(自动类型提升)会丢失精度,但只有三种情况: int&gt;float; long&gt;float; long&gt;double. 看一下他们的有效位就明白。 二进制是无法精确的...

    FunderMaps:管理和可视化基础数据

    FunderMaps 越来越多的基金会问题出现,并受到地方政府的积极调查。... 在Web文件夹中打开命令提示符,然后执行以下命令: dotnet restoredotnet ef database update这些命令将为数据库创建应用程序的用户凭据

    java开发erp源码下载-ofbiz:apacheofbiz的克隆

    转到:framework/entity/config/entityengine.xml 然后修改下面的字符串(不要把这个修改往上推) 运行以下命令 ./deploy-dev.sh # Or docker-compose -f docker-compose-databases-dev.yml up -d ./gradlew clean...

    LibraryApp:ASP.NET Core API示例

    在执行docker run命令之后,使用docker ps命令在PowerShell上检查postgres实例。 当数据库实例准备就绪时,在程序包管理器控制台中的LibraryApp.Data路径update-database或CLI中的dotnet ef database update中 ...

    模型:具有实体和存储库的Ruby持久性框架

    它提供了一个方便的公共API,可以对数据库执行查询和命令。 该体系结构简化了将业务逻辑(实体)与细节(例如持久性或验证)分开的过程。 它实现以下概念: -由其身份定义的模型域对象。 -在实体和持久层之间...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

    librepos:NET Core 2.1和Angular 6编写的微型POS系统

    此命令将在数据库中创建表。 :warning: 请注意至少已安装并使用DotNet 2.1。 另外,您需要PostgreSQL 8.x至9.x。 PostgreSQL10.x版本可能在不带来麻烦的情况下工作,但是我没有对其进行测试。 要运行项目,只需...

    Visual.Basic.2010.&.NET4.高级编程(第6版)-文字版.pdf

    10.3.5 命令的异步执行 407 10.3.6 dataadapter对象 409 10.3.7 sql server .net数据提供程序 413 10.3.8 ole db .net数据提供程序 413 10.4 dataset组件 413 10.4.1 datatablecollection对象 414 ...

    java 面试题 总结

    动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的...

    超级有影响力霸气的Java面试题大全文档

     动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件...

Global site tag (gtag.js) - Google Analytics