2017-04-21 57 views
0

最近我做了更新一些代碼,通過添加實體框架來更改它,直到現在我一直使用批量複製沒有問題,但現在我有問題找到一個好的選擇。使用實體框架的Updatet批量插入替代方案?

我必須在數據庫中插入一堆數據,現在我正在解析數據表中的所有數據,然後進行批量插入。插入它必須只在一個表中有10列,並且要插入的行可能在1000到5000之間變化,可能更多但可能沒有更多7000.我用tha數據「MyTable」準備的表格,和數據庫表「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(); 

我一直在閱讀有關,我看到了一些與此相關的是老問題,但似乎就在這個時候「批量」尚未在EF實現除對於一些定製的庫,我不確定是否允許我在代碼中使用這些庫,其他選項不是免費的。也一直試圖用Managed DataAccess版本更改Oracle.DataAccess.clietnt,但由於插入次數的原因,它似乎不是一個好主意。我一直在閱讀EF的表現,對於大插入來說不是很好,因爲這是分段插入的一部分,可以像這樣一個序列地插入4到10個插入,加上其他的東西,所以這將是很好的時間如果可能的話,這個數字不會很高......

有些建議可以真正感謝,也許一些簡單的代碼會很棒!

謝謝您的幫助和地方像這樣讓新手可以學習和繼續:)

+0

我幾天後再次takingthe問題,只是一個想法,也許有可能解決「批量」裏面的代碼的整合,但是這似乎產生問題與圖書館。該錯誤表示Oracle庫存在不兼容問題。任何想法如何解決這個問題?也許這很容易,我會保持良好的散裝時尚的方式插入... – Juano

回答

0

我前一陣子也有類似的情況,我分析可能包含數百萬行的CSV文件。我每次讀取/解析大約5000個數據,然後將它們插入數據庫並移至下一批。

當時我正在使用不同的ORM,但原理仍然相同。諸如EF6之類的ORM爲數據庫調用增加了很多開銷,他們需要跟蹤關係和其他許多事情,這就是爲什麼插入數千條記錄非常緩慢的原因。

我認爲你現在做插入的方式是最有效的方法。如果你需要速度,沒有什麼比純粹的純ADO.net直接進入SQL服務器。

真正幫助我的一個特別的工具是由優秀的Marc Gravell的stackoverflow編寫的FastMember!我不確定它是否支持oracle,但值得一看。

編輯:我剛剛想起了這個方便的擴展,我以前用來測試數據http://entityframework-extensions.net/

+0

非常感謝菲爾!問題是使用DataAccess.Client不兼容,Oracle庫版本的問題一直在增加。我沒有能夠保持這個代碼沒有在這個過程中崩潰...我看到了這個庫,但它似乎需要支付使用它不呢? – Juano

+0

我也不確定,網站不是很清楚。可能值得與網站所有者聯繫? – Phil

+0

我是這個圖書館的所有者。不幸的是,圖書館不是免費的。網站應該很快就會用一個新的設計進行更新。我會確保這一次的信息將被清除;) –

0

添加到數據庫中,但似乎在這個時候「批量」還沒有已在EF 上實施,但某些定製庫除外

您說得對。只有自定義庫支持它。

一些建議將非常感激

正如你可能已經知道,OracleBulkCopy是不是在管理數據訪問的支持。

您應該總是使用ArrayBinding來插入OracleBulkCopy。這兩個庫(Oracle.DataAccess和Oracle.ManagedDataAccess)通常都更快並且受到支持。


免責聲明:我的項目Entity Framework Extensions

的所有者此庫不是免費

這個庫可以使你的代碼更有效率,讓您保存倍數實體立刻。所有的批量操作的支持:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

多個數據庫供應商的支持,包括甲骨文。

例子:

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