【问题标题】:How to increase database insert performance with Entity Framework如何使用 Entity Framework 提高数据库插入性能
【发布时间】:2017-07-06 02:50:27
【问题描述】:

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

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

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

另一件事是——如果我没记错的话——Entity Framework 使用单独的命令插入每条记录。

有没有办法显着提高性能?

谢谢

【问题讨论】:

  • 如果性能是一个问题,最简单的解决方法是手动 SQL 查询。
  • 这是一次性(初始化)操作吗?然后你可以禁用 sql server 中的所有约束。这将加快性能。但请确保仅插入有效数据。插入后重新启用约束。

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的提示。我不知道的是 - 我将如何获得插入行的 ID?我需要它们作为在其他表中插入的参考。
  • 您可以预先分配键值,并设置一个选项以使用 INDENTITY_INSERT ON
【解决方案2】:

首先,确保使用 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;
});

【讨论】:

  • 感谢您的回答。它可以解决实体框架的问题,但在我的情况下,来自 CodingYoshi 的解决方案更容易实现。
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多