使用Entity Framework更新批量插入替代方案?

时间:2017-04-21 10:05:54

标签: c# oracle entity-framework

最近我已经通过添加实体框架更新了一些更改它的代码,直到现在我一直在使用批量复制而没有问题但是现在我遇到了一些问题需要找到一个好的替代方案。

我必须在数据库上插入一堆数据,现在我正在解析数据表上的所有数据,然后进行批量插入。插入它必须只在一个有10列的表中,并且要插入的行可以在1000到5000之间变化,可能更多但可能永远不会超过7000.我用tha数据“MyTable”准备的表和DB表“MYDB_CONTENT”:

 using (Oracle.DataAccess.Client.OracleBulkCopy bulkCopy = new Oracle.DataAccess.Client.OracleBulkCopy(dbConnectionString))                       
                    {
                        // The DBtable I'm loading the data to
                        bulkCopy.DestinationTableName = "MYDB_CONTENT";                                            
                        bulkCopy.BatchSize = csvData.Rows.Count;
                        bulkCopy.BulkCopyTimeout = 30;
                        //Load the data to the database
                        bulkCopy.WriteToServer(MyTable);

                        // Close up          
                        bulkCopy.Close();
                        bulkCopy.Dispose();

                        Console.WriteLine("Press Enter to finish.");
                        Console.ReadLine();                            
                    }
                    dbconn2.Close();

我一直在阅读,我看到一些与此相关的问题都是旧的,但似乎在这个时候“Bulk”还没有在EF上实现,除了一些定制的库,我不确定我是否我允许在我的代码上使用这些,其他选项不是免费的。也一直在尝试使用Managed DataAccess版本更改Oracle.DataAccess.clietnt,但由于插入的数量,它似乎不是一个好主意。我一直在阅读使用EF的表现并不是很好的大插入,因为这是一个分段插入的一部分,可以像这样一个顺序的4到10插入,加上其他东西正在进行所以它会是伟大的时间如果可能的话,这不会很高......

非常感谢一些建议,也许一些简单的代码会很棒!

感谢您的帮助和这样的地方,以便新手可以学习并继续:)

2 个答案:

答案 0 :(得分:1)

  

但似乎在这个时候" Bulk"尚未在EF上实施   除了一些定制的库

你是对的。只有自定义库才支持它。

  

非常感谢一些建议

您可能已经知道,Managed DataAccess不支持OracleBulkCopy。

您应始终使用ArrayBinding插入OracleBulkCopy。它通常更快并且在两个库中都受支持(Oracle.DataAccess和Oracle.ManagedDataAccess)。

免责声明:我是该项目的所有者Entity Framework Extensions

此库非自由

通过允许您一次保存多个实体,此库可以提高您的代码效率。支持所有批量操作:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

支持多个数据库提供程序,包括Oracle。

示例:

"20.0"

答案 1 :(得分:0)

前一段时间我遇到过类似的情况,我正在解析一个可能包含数百万行的CSV文件。我一次读取/解析大约5000,然后将它们插入数据库并转移到下一批。

当时我使用的是不同的ORM,但原理仍然相同。诸如EF6之类的ORM会给你的数据库调用增加很多开销,他们需要跟踪关系以及许多其他因素,这就是为什么插入数千条记录的速度非常慢。

我认为您目前正在进行插入的方式是最有效的方式。如果你需要速度,没有什么比纯粹的纯ADO.net直接到SQL服务器。

真正帮助我的一个特殊工具是由优秀的Marc Gravell编写的堆栈溢出FastMember!我不确定它是否支持oracle,但值得一看。

编辑:我刚刚记得这个方便的扩展程序,我之前使用http://entityframework-extensions.net/

将测试数据添加到数据库中