- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
EntityFramework 中支持 BulkInsert 扩展
EntityFramework 中支持 BulkInsert 扩展
很显然,你应该不至于使用 EntityFramework 直接插入 10W 数据到数据库中,那可能得用上个几分钟。EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率。此种条件下,通常会转回使用 ADO.NET 来完成任务。
但是,如果已经在项目中使用了 EntityFramework,如果碰到需要直接向数据库中插入 10W 的数据的需求,引入 ADO.NET 和 SqlBulkCopy 的组合将打破 EntityFramework 作为 ORM 所带来的优势,我们不得不再次去编写那些 SQL 语句,关注表结构的细节,相应的代码可维护性也在下降。
那么,假设我们将 SqlBulkCopy 的功能封装为 EntityFramework 中的一个扩展方法,通过接口像外暴露 BulkInsert 方法。这样,我们既没有改变使用 EntityFramework 的习惯,同时也隐藏了 SqlBulkCopy 的代码细节,更重要的是,合理的封装演进出复用的可能性,可以在多个 Entity 表中使用。
环境准备
以下测试基于 EntityFramework 6.0.2 版本。
首先定义一个 Customer 类:
复制代码
1 public class Customer
2 {
3 public long Id { get; set; }
4 public string Name { get; set; }
5 public string Address { get; set; }
6 public string Phone { get; set; }
7 }
复制代码
通过 CustomerMap 类将 Entity 映射到数据库表结构:
复制代码
1 public class CustomerMap : EntityTypeConfigurationCustomer
2 {
3 public CustomerMap()
4 {
5 // Primary Key
6 this.HasKey(t = t.Id);
7
8 // Properties
9 this.Property(t = t.Name)
10 .IsRequired()
11 .HasMaxLength(256);
12
13 this.Property(t = t.Phone)
14 .IsRequired()
15 .HasMaxLength(256);
16
17 // Table Column Mappings
18 this.ToTable(Customer, STORE);
19 this.Property(t = t.Id).HasColumnName(Id);
20 this.Property(t = t.Name).HasColumnName(Name);
21 this.Property(t = t.Address).HasColumnName(Address);
22 this.Property(t = t.Phone).HasColumnName(Phone);
23 }
24 }
复制代码
我们定义数据库的名字为 “Retail”,则使用 RetailEntities 类来实现 DbContext :
复制代码
1 public class RetailEntities : DbContext
2 {
3 static RetailEntities()
4 {
5 Database.SetInitializerRetailEntities(
6 new DropCreateDatabaseAlwaysRetailEntities());
7 }
8
9 public RetailEntities()
10 : base(Name=RetailEntities)
11 {
12 }
13
14 public DbSetCustomer Customers { get; set; }
15
16 protected override void OnModelCreating(DbModelBuilder mod
文档评论(0)