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