Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架提高数据库插入性能_C#_Entity Framework_Insert_Sql Server Ce_Database Performance - Fatal编程技术网

C# 如何使用实体框架提高数据库插入性能

C# 如何使用实体框架提高数据库插入性能,c#,entity-framework,insert,sql-server-ce,database-performance,C#,Entity Framework,Insert,Sql Server Ce,Database Performance,我有我的第一个实体框架和SQL Server Compact项目 该数据库大约有15个表,这些表都有指向其他表的外键。 我必须读取数千个XML文件并将其数据导入数据库。数据库结构反映了XML文件结构。有一个多达5个级别的表层次结构。因此,对于“top”表中的每条记录,我必须在底层表中插入一条或多条记录 我使用实体框架进行插入,效果很好,但性能非常差:(。 我认为主要的问题是,对于大多数记录,必须读回ID才能用于底层表中的记录 另一件事是——如果我知道的没错的话——实体框架用一个单独的命令插入每个

我有我的第一个实体框架和SQL Server Compact项目

该数据库大约有15个表,这些表都有指向其他表的外键。 我必须读取数千个XML文件并将其数据导入数据库。数据库结构反映了XML文件结构。有一个多达5个级别的表层次结构。因此,对于“top”表中的每条记录,我必须在底层表中插入一条或多条记录

我使用实体框架进行插入,效果很好,但性能非常差:(。 我认为主要的问题是,对于大多数记录,必须读回ID才能用于底层表中的记录

另一件事是——如果我知道的没错的话——实体框架用一个单独的命令插入每个记录

有没有办法显著提高性能

谢谢

使用库以批量方式插入数据

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

  • 在数据库中创建临时表
  • 使用库将大容量插入临时表
  • 然后执行一个存储过程,通过从暂存表读取并更新目标表的记录来执行更新

  • 首先,确保使用AddRange或其他解决方案,以确保不会由于DetectChanges方法而导致性能低下的结果

    见:

    免责声明:我是

    此库支持所有主要提供商,包括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;
    });
    

    如果性能是个问题,最简单的解决方法是手动SQL查询。这是一次性的(初始化)操作?然后您可以禁用sql server中的所有约束。这将提高性能。但请确保仅插入有效数据。插入后,请重新启用约束。感谢您的提示。我不知道的是-如何获取插入行的ID?我需要它们作为其他表中插入的引用。您可以预先访问e键的值,并设置一个选项,在Ank you上使用INDENTITY_INSERT获得该答案。它可以解决实体框架的问题,但在我的例子中,CodingYoshi的解决方案更容易实现。