EF结合SqlBulkCopy在项目中的使用

这是我第一次写博客,由于水平有限,写不出什么好东西,还望见谅。

我现在参与的这个项目采用的是EF框架,方便了数据库的访问。但在实际中,发现项目中导入市县Excel数据耗时太长,于是趁这段时间专门研究了一下大数据的导入。

Excel数据如图:

项目数据库里已经有了省市数据,任务是导入县数据。其中省市县之间有外键关系。项目里已经有了读取Excel表的方法,而且效率不低,耗时主要是在导入到Sql Server2008中

public void ImportCounties(List<County> counties)

{

List<City> cities = counties.Select(d => d.City).ToList();

MyTestEntities db = new MyTestEntities();

foreach (var city in cities)

{

Province province =

db.Provinces.Where(d => d.Name == city.Province.Name).First();

city.Province = province;

}

foreach (var county in counties)

{

db.Counties.AddObject(county);

}

db.SaveChanges();

}

这是项目里的源代码,耗时40秒左右。我测试之后发现不仅效率低,而且是有bug的。测试时第一次录入数据没问题,如果删除Counties表里的数据再导入数据是有问题的,我不知道为什么要为Province赋值而且第一次可以成功,如果有大神看见,请帮我解惑。我只能先尝试以我的方法去做。

public void ImportCountiesSecond(List<County> counties)

{

MyTestEntities db = new MyTestEntities();

List<City> cities = db.Cities.ToList();

foreach (var county in counties)

{

county.City = cities.Where(d => d.Name == county.City.Name).FirstOrDefault();

db.Counties.AddObject(county);

}

db.SaveChanges();

}

速度大概缩减到20秒,但这也不是我所能忍受的。于是上网又查了资料,了解到SqlBulkCopy。

代码如下:

public void ImportCountiesThird(List<County> counties)

{

MyTestEntities db = new MyTestEntities();

string conStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;

List<City> cities = db.Cities.ToList();

DataTable table = new DataTable();

table.Columns.Add("CityId", typeof(int));

table.Columns.Add("Name");

table.Columns.Add("OrderNum", typeof(int));

table.Columns.Add("IsCity", typeof(bool));

for (int i = 0; i < counties.Count; i++)

{

County line = counties[i];

int cityId = cities.Where(d => d.Name == counties[i].City.Name).FirstOrDefault().CityId;

string name = line.Name;

int orderNum = line.OrderNum;

bool isCity = line.IsCity;

DataRow row = table.NewRow();

row["CityId"] = cityId;

row["Name"] = name;

row["OrderNum"] = orderNum;

row["IsCity"] = isCity;

table.Rows.Add(row);

}

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conStr))

{

bulkCopy.DestinationTableName = "Counties";

bulkCopy.ColumnMappings.Add("CityId", "CityId");

bulkCopy.ColumnMappings.Add("Name", "Name");

bulkCopy.ColumnMappings.Add("OrderNum", "OrderNum");

bulkCopy.ColumnMappings.Add("IsCity", "IsCity");

bulkCopy.WriteToServer(table);

}

}

时间缩减到4秒左右,其中主要是在EF查询City表并为每一个Counties赋值时耗时占了大半。但这个的优化我觉得暂时做不到了,先这样吧。

时间: 2024-10-11 13:44:16

EF结合SqlBulkCopy在项目中的使用的相关文章

项目中如何使用EF

本文将在技术层面挑战园子里的权威大牛们,言语不敬之处敬请包涵.本文旨为技术交流,欢迎拍砖. 园子里面分享和推荐Entity Framework(以下简称EF)的Repository(仓储)设计模式的文章真不少,其中还有很多大牛很详细描述怎么去实现.但是这些文章真是害人不浅.我现在想问问这些大牛们,你们现在的项目真的还在这样用吗? 下面是在找找看里面随便挑的几篇,如果你从未了解过EF Repository,你可以看看: 分享基于Entity Framework的Repository模式设计(附源码

其他的项目调用DAL项目中的EF Model

 Based on your description and the error code, you will just need to ensure that your DataContext class inheirits from IDisposible: public class YourDataContextClass : DbContext,IDisposable { //Your class details here } And then install the EntityF

项目中 2个或者多个EF模型 表名称相同会导致生成的实体类 覆盖的解决方法

场景:  2个数据库, 一个新,一个旧,  把旧的 数据库中的数据,导入到新的数据库中,  使用到了2个 EF实体模型, 新数据库 和 旧数据库中的表,有的名称是相同的 (但是结构是不同的) 旧的数据库中的 tb_area 表,只有2个字段 新数据库中的 tb_area 有很多字段  ,结果新数据库里面的 表,由于和旧数据库的表 重名,导致旧数据库里面的  表生产的cs文件 没有了, 只剩下新数据库中的表实体   那么现在问题就来了,我要调用旧表里面的 model 实体模型,怎么拿呢? 拿不到了

visual studio 项目中使用EF创建的数据库,后续更新数据库操作(生产已经部署,不能删除数据库重新创建)

情景:SharePoint项目(其他类型的项目道理也一样),数据库是用EF(版本:6.0.0.0)创建的,生产环境已经使用,所以后续修改数据库,只能通过更新来实现. 下面是具体的操作方式: 1.visual studio 打开项目,打开“程序包管理控制台”. 操作方式:视图--其他窗口--程序包管理控制台 2.项目“引用”中 EntityFramework.SqlServer.dll 和 EntityFramework.dll 这两个文件的属性要复制到本地 操作方式:选中文件--按F4--属性对

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

Ado.Net实体数据模型EF,如何在代码中添加数据库连接密码

在创建EF模型的时候,VS2013提示说“在连接字符串中存储敏感数据可能有安全风险”,于是我选择了在代码中添加,可是如何通过代码添加呢? 我在网上百度了下,没有人说的清楚直观. 假设我们创建了一个名字是“mytest”的实体数据模型,那么在项目中就会生成一个mytest.emdx,我们展开它mytest.emdx -> mytest.Context.tt -> mytest.Context.cs 在这个cs文件中我们能够看到一个构造函数,假设你的数据库名称是mydb,它的类名就是mydbEnt

开源ORM之Dapper在项目中的尝试

关于轻量级开源ORM-Dapper的介绍网上有太多例子,自己无意再重复介绍了,本文只是记录下Dapper在目前项目中的应用或者尝试.先说下背景,来到新公司有段时间了,这期间接触了几个项目,发现有一个问题就是所有这些项目的数据访问层无一例外的都是用最原始的ado.net(SqlHelper类只是对ado.net进行粗糙地封装),而且每次进行CRUD操作时都要传递数据库连接字符串和SqlParamerter数组,还有一些其他的额外参数,而且返回来的结果还得自己再调用另外的方法去反射得到具体的实体对象

2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介绍了此架构的基本分层,在第二篇中,以登陆功能为例,介绍了项目的代码结构.在本篇中将通过过滤器实现用户权限验证功能. 同样,文中有问题的地方欢迎批评指正!谢谢! 开发背景  在一个常规系统中权限验证是不可缺的,在较简单的系统中,用户只会被简单归为登陆用户和游客,而在较为复杂的系统中,除了判断用户是否登

MVC+EF+Autofac(dbfirst)轻型项目框架

前言 原来一直使用他人的开源项目框架,异常的定位会很麻烦,甚至不知道这个异常来自我的代码还是这个框架本身.他人的框架有一定的制约性,也有可能是我对那些框架并没深入了解,因为这些开源框架在网上也很难找到高效并且规范的文档.比如别人的框架可能调用了Enterprise Library来实现权限的验证,但在我的项目中,权限验证有可以复用的模块,所以在整合时会非常不灵活.... 参考了很多网上的优秀框架,看了几本书后,突然意识到易用才是开发和使用框架的出发点与立足点,框架并不是越复杂越好,评价一个框架的