2014-10-06 57 views
2

我們在SQL Server中使用EF Code First,並且我們有一組相當大的主數據集(〜150.000條記錄),在創建數據庫時必須進行初始化。如果這可以在db-intializer的Seed方法中完成,那將很方便。如何用EF代碼優先有效地初始化大種子?

我已經生成了初始化這些數據的SQL腳本。該腳本由行組成,每行包含一千條記錄的INSERT操作。原因是INSERT命令在單個命令中有1000個總記錄的限制。

這樣的腳本是類似以下內容:

INSERT INTO MyTable (A, B, C) VALUES (1, 2, 3), (2, 3, 4), ... 1000 records here ... (3, 4, 5); 
INSERT INTO MyTable (A, B, C) VALUES (4, 5, 6), (5, 6, 7), ... 1000 records here ... (6, 7, 8); 
.... 150 lines 

我們Seed方法的初始化部分看起來是這樣的:

foreach (string command in File.ReadAllLines("InsertMasterData.sql")) 
{ 
    context.Database.ExecuteSqlCommand(command); 
} 

然而,這幾乎把我的開發機上2分鐘,使用SQL LocalDB實例(生產中使用的全面SQL Server可能會更快,但使用LocalDB進行開發很方便)。

有什麼辦法可以讓這個更快嗎?

+0

這是單元測試,所以它一直做?否則,2分鐘作爲「一次性操作」聽起來不太可怕。 – 2014-10-06 18:28:49

+0

[改進實體框架中的批量插入性能]可能的副本(http://stackoverflow.com/questions/6107206/improving-bulk-insert-performance-in-entity-framework) – 48klocs 2014-10-06 18:29:19

+0

我們在開發的早期,所以它有每當模型發生變化時都要完成,因爲我們還沒有開始使用遷移。當然,如果沒有簡單的方法使其更快,我總是可以創建一個較小版本的主數據並在開發過程中使用它。 – 2014-10-06 20:09:48

回答

1

我們有類似的情況,我們播種腳本。這是我們的代碼。您不需要使用異步方法。它在幾秒鐘內在當地種下約35,000條記錄。

foreach (string file in files) 
      { 
       var fileInfo = new FileInfo(file); 

       Console.WriteLine("Running script {0}", fileInfo.Name); 

       string text = fileInfo.OpenText().ReadToEnd(); 

       using (var conn = new SqlConnection(connectionString)) 
       { 
        using (var cmd = new SqlCommand(text, conn)) 
        { 
         conn.Open(); 

         await cmd.ExecuteNonQueryAsync(); 
        } 
       } 
      }