如何使用Entity Framework提高数据库插入性能

时间:2017-02-16 19:50:27

标签: c# entity-framework insert sql-server-ce database-performance

我的第一个项目是Entity Framework和SQL Server Compact。

数据库有大约15个表,这些表都有其他表的外键。 我必须读取数千个XML文件并将其数据导入数据库。数据库结构镜像XML文件结构。最多有5个级别的表层次结构。因此,对于“顶部”表中的每条记录,我必须在基础表中插入一个或多个。

我正在使用Entity Framework进行插入,它工作正常,但性能非常差:(。 我认为主要的问题是,对于大多数记录,必须回读ID以用于基础表中的记录。

另一件事是 - 如果我知道的话 - 实体框架使用单独的命令插入每条记录。

有没有办法大幅提升效果?

谢谢

2 个答案:

答案 0 :(得分:0)

使用SQL Compact Bulk Insert Library库以批量形式插入数据。

如果您需要更新任何记录,请使用此技术:

  1. 在数据库中创建临时表
  2. 使用库批量插入临时表
  3. 然后执行存储过程以通过读取登台表并更新目标表的记录来进行更新。

答案 1 :(得分:0)

首先,请确保使用AddRange或其他解决方案,以确保由于DetectChanges方法而导致性能结果不佳。

请参阅:http://entityframework.net/improve-ef-add-performance

免责声明:我是Entity Framework Extensions

的所有者

此库支持所有主要提供商,包括 SQL Server Compact

默认情况下,BulkInsert会自动获取插入行的ID。

此库允许您执行场景所需的所有批量操作:

  • 批量保存更改
  • 批量插入
  • 批量删除
  • 批量更新
  • 批量合并

实施例

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Primary Key
context.BulkMerge(customers, operation => {
   operation.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});