如何使用EF Code First有效地初始化大种子?

时间:2014-10-06 18:26:10

标签: c# sql sql-server entity-framework ef-code-first

我们在SQL Server中使用EF Code First,并且我们有一组相当大的主数据(~150.000条记录),在创建数据库时必须对其进行初始化。如果可以在db-intializer的Seed方法中完成,那将会很方便。

我已经生成了初始化此数据的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);
}

但是,在我的开发人员计算机上使用SQL LocalDB实例几乎需要2分钟(在生产中使用的完整SQL Server上可能会更快,但使用LocalDB进行开发会很方便。)

有没有办法让它更快?

1 个答案:

答案 0 :(得分: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();
                    }
                }
            }