阅读目录

  • 插入
  • 更新
  • 删除

在使用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中的那些批量操作相关推荐

  1. EF中的那些批量操作

    在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...

  2. 关于EF中ApplyCurrentValues和ApplyOriginalValues区别

    关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. //         // 摘要:         //     将 System ...

  3. EF中加载实体的方式

    EF中的查询执行时机: 1. foreach进行枚举 2. ToArray.ToList.ToDictionary 3. Linq的一些操作,如First.Any 4. DbSet上的Load操作.D ...

  4. EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择

    一:ef中的三种开发方式 1. db first... db放在第一位,在我们开发之前必须要有完整的database,实际开发中用到最多的... <1> DBset集合的单复数... db ...

  5. CodeFirst EF中导航属性的个人理解

    >导航属性: 01.个人理解就是Ef中的属性在实体数据表中不存在(先这么认为); 02.就是除了根据表中列映射出的属性 之外根据表与表之间的关系的关联属性.方便操作与之关联的表; 例如: 有 表 ...

  6. EF框架学习(5)---EF中的在线和离线场景

    EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...

  7. mvc+ef中比较数据

    例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...

  8. EF中使用SQL语句或存储过程

    EF中使用SQL语句或存储过程   1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserIn ...

  9. 在EF中执行SQL语句

    一.为什么要在EF中执行SQL语句   使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库 ...

最新文章

  1. Window VNC远程控制LINUX:VNC详细配置介绍
  2. sklearn 岭回归
  3. Codeforces Round #552 (Div. 3) —— B. Make Them Equal
  4. 2月国内操作系统市场份额:Windows XP持续下降
  5. Python 线程优先队列 PriorityQueue - Python零基础入门教程
  6. stm32 SPI架构
  7. WPF中MVVM模式(简略介绍)
  8. php 防止access token过期,微信調用接口,防止Access_token過期的方法
  9. Spring之Aop代理对象的产生(一)
  10. 自动化测试之数据驱动测试
  11. 还不到4折:赶紧来抢券啊!!!
  12. 万国觉醒信号进爆满服务器,游漫谈:《万国觉醒》冷知识,玩家纷纷联盟,千人同屏硬刚服务器...
  13. Global Malmquist-Luenberger 指数分解及matlab应用,文后有网盘链接
  14. STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁
  15. 标准USB/Mini-USB接口,及OTG
  16. 蓝牙耳机什么牌子好?盘点四款音质最好的蓝牙耳机
  17. 微信公众号项目开发笔记 一
  18. 学校计算机管理员考核,电脑室管理员工作职责是什么
  19. 公民个人信息安全须利剑“常出鞘”
  20. 最新计算机是哪种,pc机属于什么类型计算机

热门文章

  1. js怎么把函数字符串转成函数_字符串处理函数
  2. windows下安装tmux_如何在Windows下 git bash 环境内使用tmux
  3. 香肠派对电脑版_《香肠派对》新春直播活动来袭
  4. c语言整数与平均值,编写求一组整数的和与平均值的程序
  5. python导入自定义文件_python引入导入自定义模块和外部文件的实例
  6. 阿里云mysql服务器太贵_阿里云数据库,跟自己在服务器安装的有什么区别?有人说安装很简单,那为什么要花钱买?...
  7. linux+路由器信号检测工具,Linux下常用网络故障调试工具介绍之Ping命令使用
  8. spark java8 scala_在 Ubuntu16.04 中搭建 Spark 单机开发环境 (JDK + Scala + Spark)
  9. android studio复选按钮样式_Ubuntu与Android开发的邂逅
  10. python rgb led控件_Raspberry Pi-用树莓派实现RGB LED的颜色控制——Python版本-电路城论坛 - 电子工程师学习交流园地...