EF批量添加数据性能慢的问题的解决方案
//EF批量添加数据性能慢的问题的解决方案
public ActionResult BatchAdd()
{
using (var db = new ToneRoad.CEA.DbContext.DbContext())
{
//**********************第一种解决方案 直接使用sql**********************
string sqls = "";
for (int i = ; i < ; i++)
{
sqls += "sql" + i;
}
db.Database.ExecuteSqlCommand(sqls);
//**********************第二种解决方案 异步并行计算**********************
List<SYS_User> LIST = new List<SYS_User>();
ParallelOptions _po = new ParallelOptions();
_po.MaxDegreeOfParallelism = Environment.ProcessorCount;
Parallel.ForEach<SYS_User>(LIST, c =>
{
db.SYS_User.Add(c);
db.SaveChanges();
});
//**********************第三种解决方案 关闭EF跟踪验证**********************
//关闭 自动跟踪对象的属性变化的功能,默认情况下EF会开启对附加到EF上下文中的实体对象进行校验,看已经附加到上下文中的实体对象的属性是否发生变化,这在大量数据添加时会影响性能。
db.Configuration.AutoDetectChangesEnabled = false;
//保存前验证对象的属性最大最小长度等,默认为true,关闭会提高性能
db.Configuration.ValidateOnSaveEnabled = false;
List<SYS_User> list = new List<SYS_User>();
for (int i = ; i < ; i++)
{
SYS_User user = new SYS_User() { UserName = "sa", Password = "" };
list.Add(user);
}
db.SYS_User.AddRange(list);
db.SaveChanges();
//**********************第四种解决方案 使用SQL Server的bcp命令**********************
//Microsoft SQL Server 提供的一个称为 bcp(批量流处理)) 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表
List<SYS_User> lists = new List<SYS_User>();
for (int i = ; i < ; i++)
{
SYS_User user = new SYS_User() { UserName = "sa", Password = "" };
lists.Add(user);
}
BulkCopy<SYS_User>(db, lists);
return View();
}
}
public void BulkCopy<T>(ToneRoad.CEA.DbContext.DbContext db, IList<T> list)
{
using (var con = db.Database.Connection as System.Data.SqlClient.SqlConnection)
{
con.Open();
using (var bulkCopy = new SqlBulkCopy(con))
{
bulkCopy.BatchSize = list.Count;
bulkCopy.DestinationTableName = typeof(T).Name;
var table = new DataTable();
var props = TypeDescriptor.GetProperties(typeof(T))
.Cast<PropertyDescriptor>()
.Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
.ToArray();
foreach (var propertyInfo in props)
{
bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
table.Columns.Add(propertyInfo.Name,
Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
}
var values = new object[props.Length];
foreach (var item in list)
{
for (var i = ; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
bulkCopy.WriteToServer(table);
}
con.Close();
}
}
EF批量添加数据性能慢的问题的解决方案的更多相关文章
- EF 批量添加数据
原文:https://www.cnblogs.com/liuruitao/p/10049191.html 原文:https://www.cnblogs.com/yaopengfei/p/7751545 ...
- EF批量添加数据之修改SQL Server执行上限
asp.net core 项目 打开Startup.cs services.AddDbContext<MyContext>( options => { options.UseSqlS ...
- .Net中批量添加数据的几种实现方法比较
在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...
- ADO.NET- 中批量添加数据的几种实现方法比较
在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...
- ThinkPHP批量添加数据和getField()示例
批量添加数据 // 批量添加数据 $User = M('users'); $dataList[] = array('name'=>'thinkphp','email'=>'thinkphp ...
- thinkphp3.2 批量添加数据
这是我遇到的thinkphp3.2 当中最让我无语的坑 批量添加数据有个方法是 addAll() 这个方法一定要注意数组的键名,一定要整齐!!! 可以在存入数据前,用ksort()方法将数组的键名排序 ...
- spring boot之使用通用Mapper批量添加数据
通用Mapper是一款针对mybatis进行扩展的轻量级组件,使用起来非常方便.当调用其针对mysql进行批量添加数据的方法时,发现报错,仔细研究了一番,发现是在使用通用Mapper上出现了问题.下面 ...
- Yii2如何批量添加数据
批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧. 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然, ...
- EF批量添加
1.首先,打开工具——NuGet包管理器——管理解决方案的NoGet程序包——搜索Z.EntityFramework.Extensions 点击安装!!! codefirst定义一个实体,用EF的方法 ...
随机推荐
- 【HTML】 frame和iframe的区别
1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...
- 解决IE兼容模式问题
IE浏览器从IE8开始添加了兼容模式,开启后会以低版本的IE进行渲染.在浏览网页时候会出现网页显示问题,于是可以在html中加入以下代码来使IE使用固定的渲染模式: <metahttp-equi ...
- iOS 多线程GCD的基本使用
<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...
- Linux安全基础:awk命令的使用
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- Android Log Tag含义
在分析Android问题的时候重要的手段之一就是分析log,在events.log中有很多系统log,其中有些log的含义并不是很了解,下面就是从安卓源码中得到的系统log的tag. 关于Tag的说明 ...
- readonly
readonly 关键字是可以在字段上使用的修饰符. 当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中. 示例 在此示例 ...
- 使用logminer挖掘日志,分析历史操作 系列一
===============STARTED==================================== 事件起因: 业务的人mail过来说是有张表记录的10K+的优惠码记录没了,要我们确 ...
- SQL Server:触发器详解
1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活. 所以触发器可以用来实现对表实施复杂的完整性约束. 2. 触发器的分类 SQL S ...
- java请求https地址如何绕过证书验证?
原文http://www.blogjava.net/hector/archive/2012/10/23/390073.html 第一种方法,适用于httpclient4.X 里边有get和post两种 ...
- hdu2082 找单词 (母函数)
找单词 题意: 中文题,考虑是不是要写个英文题意..(可惜英语水平不够 囧rz) (题于文末) 知识点: 母函数(生成函数): 生成函数有普通型生成函数和指数型生成函数 ...