0

我有我的第一个实体框架和SQL Server Compact项目。如何使用实体框架提高数据库插入性能

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

我正在使用实体框架插入和它工作正常,但表现是非常非常差:(。 我认为主要问题是,对于大多数记录的ID必须回读用于记录在基础表

的另一件事是 - 如果我知道对不对? - 即实体框架插入带有一个单独的命令每个记录

是否有显着提高性能的方式

谢谢

+0

如果性能问题,最简单的解决方法是手动SQL查询。 – Kilazur

+0

这是一次(初始化)操作吗?然后你可以在sql server中禁用所有约束。这将加速性能。但请确保仅插入有效数据。插入后重新启用约束。 –

回答

0

使用SQL Compact Bulk Insert Library库来将数据插入到批量中。

如果您需要更新任何记录,那么使用这种技术:

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

谢谢你的提示。我不知道的是 - 我将如何获取插入行的ID?我需要它们作为插入其他表中的引用。 – BitEater

+0

您可以预先分配键值,并设置一个选项来使用INDENTITY_INSERT ON – ErikEJ

0

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

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

免责声明:我的Entity Framework Extensions

该库支持所有主要供应商包括的SQL Server Compact

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

这个库可以让你执行你需要为你的场景的所有批量操作:

  • 散装的SaveChanges
  • 容量插入
  • 批量删除
  • 批量更新
  • 批量合并

示例

// 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; 
}); 
+0

谢谢你的回答。它可以解决实体框架的问题,但CodingYoshi的解决方案在我的情况下更容易实现。 – BitEater