[转载]EF中的那些批量操作
阅读目录
- 插入
- 更新
- 删除
在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率。那么这篇文章就来总结EF中的那些批量操作。
插入
1,单个插入
单个插入很简单,只需要构造好实体,然后调用DbSet的Add方法,最后SaveChanges就行,示例代码如下。
using (var db = new PackageFHContext()) { // 单个插入 var entity = new ProdImage { ProductID = 1807, Type = 7, Priority = 0, Url = " http://www.baidu.com/abc.png", Alt = "test", Creator = "system", CreateOn = DateTime.Now }; db.ProdImageSet.Add(entity); db.SaveChanges(); }
2,批量插入
很多时候我们需要向同一数据表插入大量的数据,如果插入一条就调一次SaveChanges这样性能很低,需要频繁地访问数据库。为了解决这个问题,可以使用SqlBulkCopy来批量插入数据,这样很大地提高性能。示例代码如下。
using (var db = new PackageFHContext()) { // 批量插入(使用到SqlBulkCopy) var prodImages = new List<ProdImage>(); for (int i = 0; i < 50; i++) { prodImages.Add(new ProdImage { ProductID = 1807, Type = 7, Priority = 0, Url = " http://www.baidu.com/abc.png", Alt = "test" + i, Creator = "system", CreateOn = DateTime.Now }); } if (db.Database.Connection.State != ConnectionState.Open) { db.Database.Connection.Open(); } PackageFH.Common.DBHelper.BulkInsert((SqlConnection)db.Database.Connection, "dbo.Pkg_ProdImage", prodImages); if (db.Database.Connection.State != ConnectionState.Closed) { db.Database.Connection.Close(); } }
当然SqlBulkCopy的操作封装在了DBHelper中了,后面会附上DBHelper.BulkInsert的实现。
更新
1,单个更新
单个更新很简单,只需要先查询出那条数据,然后修改字段的值,最后SaveChanges就行。示例代码如下。
using (var db = new PackageFHContext()) {// 单个更新var entity = db.ProdImageSet.FirstOrDefault(p => p.ImageID == 275695);entity.Alt = "ooooooooooo";db.SaveChanges(); }
2,批量更新
我们可以先查找要更新的那些记录,然后遍历修改字段的值,最后调用SaveChanges提交更新。示例代码如下。
using (var db = new PackageFHContext()) {// 批量更新var entitys = db.ProdImageSet.Where(p => p.ProductID == 1807 && p.Type == 7);var j = 1;entitys.ToList().ForEach(item =>{item.Alt = "update test" + j;db.Entry(item).State = System.Data.Entity.EntityState.Modified; //不加这句也可以,为什么?j++;});db.SaveChanges(); }
通过SQL Profiler监控可以看到,最后生成的还是很多的UPDATE语句,也就是说每更新一条就是一个UPDATE语句。
删除
1,单个删除
示例代码如下。
using (var db = new PackageFHContext()) {// 单个删除var entity = db.ProdImageSet.FirstOrDefault(p => p.ImageID == 275695);db.ProdImageSet.Remove(entity);db.SaveChanges(); }
2,批量删除
示例代码如下。
using (var db = new PackageFHContext()) {// 批量删除var entitys = db.ProdImageSet.Where(p => p.ProductID == 1783 && p.Type == 0);entitys.ToList().ForEach(entity => db.Entry(entity).State = System.Data.Entity.EntityState.Deleted); //不加这句也可以,为什么?db.ProdImageSet.RemoveRange(entitys);db.SaveChanges(); }
通过SQL Profiler监控,结果生成的也是多条DELETE语句。
附:DBHelper.BulkInsert的实现代码
1 public static void BulkInsert<T>(SqlConnection conn, string tableName, IList<T> list)2 {3 using (var bulkCopy = new SqlBulkCopy(conn))4 {5 bulkCopy.BatchSize = list.Count;6 bulkCopy.DestinationTableName = tableName;7 8 var table = new DataTable();9 var props = TypeDescriptor.GetProperties(typeof(T), new Attribute[] { new DatabaseTableColumnAttribute() }) 10 //Dirty hack to make sure we only have system data types 11 //i.e. filter out the relationships/collections 12 .Cast<PropertyDescriptor>() 13 .Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System")) 14 .ToArray(); 15 16 foreach (var propertyInfo in props) 17 { 18 bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); 19 table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); 20 } 21 22 var values = new object[props.Length]; 23 foreach (var item in list) 24 { 25 for (var i = 0; i < values.Length; i++) 26 { 27 values[i] = props[i].GetValue(item); 28 } 29 30 table.Rows.Add(values); 31 } 32 33 bulkCopy.WriteToServer(table); 34 } 35 }
转载于:https://www.cnblogs.com/volon/p/5579645.html
[转载]EF中的那些批量操作相关推荐
- EF中的那些批量操作
在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...
- 关于EF中ApplyCurrentValues和ApplyOriginalValues区别
关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. // // 摘要: // 将 System ...
- EF中加载实体的方式
EF中的查询执行时机: 1. foreach进行枚举 2. ToArray.ToList.ToDictionary 3. Linq的一些操作,如First.Any 4. DbSet上的Load操作.D ...
- EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择
一:ef中的三种开发方式 1. db first... db放在第一位,在我们开发之前必须要有完整的database,实际开发中用到最多的... <1> DBset集合的单复数... db ...
- CodeFirst EF中导航属性的个人理解
>导航属性: 01.个人理解就是Ef中的属性在实体数据表中不存在(先这么认为); 02.就是除了根据表中列映射出的属性 之外根据表与表之间的关系的关联属性.方便操作与之关联的表; 例如: 有 表 ...
- EF框架学习(5)---EF中的在线和离线场景
EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...
- mvc+ef中比较数据
例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...
- EF中使用SQL语句或存储过程
EF中使用SQL语句或存储过程 1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserIn ...
- 在EF中执行SQL语句
一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库 ...
最新文章
- Window VNC远程控制LINUX:VNC详细配置介绍
- sklearn 岭回归
- Codeforces Round #552 (Div. 3) —— B. Make Them Equal
- 2月国内操作系统市场份额:Windows XP持续下降
- Python 线程优先队列 PriorityQueue - Python零基础入门教程
- stm32 SPI架构
- WPF中MVVM模式(简略介绍)
- php 防止access token过期,微信調用接口,防止Access_token過期的方法
- Spring之Aop代理对象的产生(一)
- 自动化测试之数据驱动测试
- 还不到4折:赶紧来抢券啊!!!
- 万国觉醒信号进爆满服务器,游漫谈:《万国觉醒》冷知识,玩家纷纷联盟,千人同屏硬刚服务器...
- Global Malmquist-Luenberger 指数分解及matlab应用,文后有网盘链接
- STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁
- 标准USB/Mini-USB接口,及OTG
- 蓝牙耳机什么牌子好?盘点四款音质最好的蓝牙耳机
- 微信公众号项目开发笔记 一
- 学校计算机管理员考核,电脑室管理员工作职责是什么
- 公民个人信息安全须利剑“常出鞘”
- 最新计算机是哪种,pc机属于什么类型计算机
热门文章
- js怎么把函数字符串转成函数_字符串处理函数
- windows下安装tmux_如何在Windows下 git bash 环境内使用tmux
- 香肠派对电脑版_《香肠派对》新春直播活动来袭
- c语言整数与平均值,编写求一组整数的和与平均值的程序
- python导入自定义文件_python引入导入自定义模块和外部文件的实例
- 阿里云mysql服务器太贵_阿里云数据库,跟自己在服务器安装的有什么区别?有人说安装很简单,那为什么要花钱买?...
- linux+路由器信号检测工具,Linux下常用网络故障调试工具介绍之Ping命令使用
- spark java8 scala_在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)
- android studio复选按钮样式_Ubuntu与Android开发的邂逅
- python rgb led控件_Raspberry Pi-用树莓派实现RGB LED的颜色控制——Python版本-电路城论坛 - 电子工程师学习交流园地...