2014-10-06 56 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(); 
        } 
       } 
      }