//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批量添加数据性能慢的问题的解决方案的更多相关文章

  1. EF 批量添加数据

    原文:https://www.cnblogs.com/liuruitao/p/10049191.html 原文:https://www.cnblogs.com/yaopengfei/p/7751545 ...

  2. EF批量添加数据之修改SQL Server执行上限

    asp.net core 项目 打开Startup.cs services.AddDbContext<MyContext>( options => { options.UseSqlS ...

  3. .Net中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  4. ADO.NET- 中批量添加数据的几种实现方法比较

    在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...

  5. ThinkPHP批量添加数据和getField()示例

    批量添加数据 // 批量添加数据 $User = M('users'); $dataList[] = array('name'=>'thinkphp','email'=>'thinkphp ...

  6. thinkphp3.2 批量添加数据

    这是我遇到的thinkphp3.2 当中最让我无语的坑 批量添加数据有个方法是 addAll() 这个方法一定要注意数组的键名,一定要整齐!!! 可以在存入数据前,用ksort()方法将数组的键名排序 ...

  7. spring boot之使用通用Mapper批量添加数据

    通用Mapper是一款针对mybatis进行扩展的轻量级组件,使用起来非常方便.当调用其针对mysql进行批量添加数据的方法时,发现报错,仔细研究了一番,发现是在使用通用Mapper上出现了问题.下面 ...

  8. Yii2如何批量添加数据

    批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧. 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然, ...

  9. EF批量添加

    1.首先,打开工具——NuGet包管理器——管理解决方案的NoGet程序包——搜索Z.EntityFramework.Extensions 点击安装!!! codefirst定义一个实体,用EF的方法 ...

随机推荐

  1. jquery返回顶部,支持手机

    jquery返回顶部,支持手机 效果体验:http://hovertree.com/texiao/mobile/6/ 在pc上我们很容易就可以用scrollTop()来实现流程的向上滚动的返回到顶部的 ...

  2. JQ基础之选择器

    JQ选择器与CSS/CSS3选择器非常类似,对于学过CSS/CSS3的朋友来说可以是快速上手,下面总结了比较常用的选择器. ID选择器 $('#one') ( '#'代表ID ) CLASS选择器 $ ...

  3. iOS适配 旧项目工程在iOS9下不能正常显示

    在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...

  4. iOS---searchBar 搜索框 光标初始位置后移

    #import <UIKit/UIKit.h> @interface SearchBar : UITextField @property (nonatomic,strong) UIButt ...

  5. iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具

    这是个很有用的列别工具类,在聊天对话框添加和QQ一样的"复制.粘贴.取消"等选项,而且使用起来很方便,只要找到聊天泡泡内部的某个View,比如Label或者背景冒泡的UIImage ...

  6. 触屏touchstart 与 click

    设计效果:当手指点击或触摸红框线menuList之外的部分时,弹框menuList消失. 问题:在优化触屏版的时候发现如图问题,当menuList弹出,手指触摸屏幕向下滑动时,menuList弹框不消 ...

  7. Linux下Oracle 10.2.0.1升级到10.2.0.4总结

    最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...

  8. SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint "FK_subplan_job_id"

    案例环境: 数据库版本: Microsoft SQL Server 2005 (Microsoft SQL Server 2005 - 9.00.5000.00 (X64) ) 案例介绍: 对一个数据 ...

  9. SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。

    案例环境: 操作系统版本 : Windows Server 2008 R2 Standard  SP1 数据库版本   :  Microsoft SQL Server 2012 (SP1) - 11. ...

  10. 15天玩转redis —— 第十一篇 让你彻底了解RDB存储结构

    接着上一篇说,这里我们来继续分析一下RDB文件存储结构,首先大家都知道RDB文件是在redis的“快照”的模式下才会产生,那么如果 我们理解了RDB文件的结构,是不是让我们对“快照”模式能做到一个心中 ...