Entity Framework——执行sql语句

EF版本:6.0.0

EF对大量数据或多表连接一次操作耗时较大,或要求响应时间尽可能小,因此采用EF框架执行SQL语句的方案

1DbContext.Database

这个类包含了大量的操作方法,见截图:

查询方法举例:

using (CustomDbContext db = new CustomDbContext())
            {
                string sql = "SELECT * FROM collections LEFT JOIN collectionusers ON collections.`Id`=collectionusers.`Collection_Id`";
                var task = db.Database.SqlQuery<Collection>(sql).ToListAsync();
                task.Wait();
                var r = task.Result;
            }

删除方法举例:

using (CustomDbContext db = new CustomDbContext())
            {
                string sql = "delete from collectionusers where Id=@id";
                var num = db.Database.ExecuteSqlCommand(sql, new MySqlParameter("@id", 322));
            }

注意操作Mysql数据库,一定要是有MySqlParameter而不能使用SqlParameter,使用SqlParameter会抛出异常:Only MySqlParameter objects may be stored

更新方法举例:

using (CustomDbContext db = new CustomDbContext())
            {
                string sql = "update collectionusers set InsertTime=@time where Id=@id";
                var num = db.Database.ExecuteSqlCommand(sql, new MySqlParameter("@time", DateTime.Now),new MySqlParameter("@id", 323));
            }

插入方法举例:

using (CustomDbContext db = new CustomDbContext())
            {
                db.Database.ExecuteSqlCommand("SET SQL_SAFE_UPDATES=0");//不启用更新安全模式
                db.Database.ExecuteSqlCommand("SET FOREIGN_KEY_CHECKS=0");//取消外键约束
                string sql = "INSERT INTO collectionusers (`InsertTime`, `Collection_Id`, `User_Id`)VALUES(@insertTime,@cid, @uid)";
                var num = db.Database.ExecuteSqlCommand(sql, new MySqlParameter("@insertTime", DateTime.Now), new MySqlParameter("@cid", 11), new MySqlParameter("@uid",22));
            }

事务操作举例:

CustomDbContext db = null;
            DbContextTransaction tran = null;
            try
            {
                db = new CustomDbContext();
                tran = db.Database.BeginTransaction();
                db.Database.ExecuteSqlCommand("SET SQL_SAFE_UPDATES=0");//不启用更新安全模式
                db.Database.ExecuteSqlCommand("SET FOREIGN_KEY_CHECKS=0");//取消外键约束
                string sql = "INSERT INTO collectionusers (`InsertTime`, `Collection_Id`, `User_Id`)VALUES(@insertTime,@cid, @uid)";
                var num = db.Database.ExecuteSqlCommand(sql, new MySqlParameter("@insertTime", DateTime.Now), new MySqlParameter("@cid", 11), new MySqlParameter("@uid", 22));
                tran.Commit();
            }
            catch
            {
                tran.Rollback();
            }
            finally
            {
                if (db != null) db.Dispose();
                if (tran != null) tran.Dispose();
            }

 -----------------------------------------------------------------------------------------

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

JDBC为什么要使用PreparedStatement而不是Statement

PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 Callab...

21210
来自专栏陈满iOS

[iOS学习笔记]·FMDB:第三方本地数据库处理框架(官方文档翻译篇)

创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:

612
来自专栏Golang语言社区

服务器 数据库设计技巧--2

8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t wheresubstring...

2869
来自专栏GreenLeaves

ORACLE中%TYPE和%ROWTYPE的使用

1、%TYPE 为了使一个新定义的变量与另一个已经定义了的变量(通常是表的某一列)的数据类型保持一致,Oracle提供了%Type的定义方式,当被参照的那个变量...

1867
来自专栏Java呓语

第23章、存储程序和视图

本章讨论存储的程序和视图,这些数据库对象是根据存储在服务器上供以后执行的SQL代码定义的数据库对象。

593
来自专栏linux驱动个人学习

高通HAL层之bmp18x.cpp

下面bmp18x sensor为例进行分析。 BMP18x Sensor: 我们以打开bmp180为例,代码为hardware\qcom\sensors\Bmp...

3557
来自专栏c#开发者

General Database Adapter for Biztalk Server 2006 介绍

General Database Adapter for Biztalk Server 2006 介绍 目前该adapter分单向的Receive Adapte...

31111
来自专栏王硕

原 透过pageinspect了解Post

34915
来自专栏chenssy

【死磕Sharding-jdbc】---SQL解析-词法分析

sharding-jdbc对SQL解析的源码主要在下图所示parsing模块中,由下图可知SQL解析主要分为两部分:lexer和parser。lexer就是本文...

632
来自专栏java一日一条

JDBC为什么要使用PreparedStatement而不是Statement

PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(...

433

扫码关注云+社区