Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何首先使用EF代码高效地初始化大型种子?_C#_Sql_Sql Server_Entity Framework_Ef Code First - Fatal编程技术网

C# 如何首先使用EF代码高效地初始化大型种子?

C# 如何首先使用EF代码高效地初始化大型种子?,c#,sql,sql-server,entity-framework,ef-code-first,C#,Sql,Sql Server,Entity Framework,Ef Code First,我们首先在SQL Server中使用EF代码,并且我们有一组相当大的主数据(约150.000条记录),在创建数据库时必须对其进行初始化。如果可以在db初始化器的Seed方法中执行此操作,则会很方便 我已生成初始化此数据的SQL脚本。脚本由行组成,每行包含一千条记录的插入操作。原因是INSERT命令在单个命令中的记录总数限制为1000条 因此,脚本类似于以下内容: INSERT INTO MyTable (A, B, C) VALUES (1, 2, 3), (2, 3, 4), ... 1000

我们首先在SQL Server中使用EF代码,并且我们有一组相当大的主数据(约150.000条记录),在创建数据库时必须对其进行初始化。如果可以在db初始化器的
Seed
方法中执行此操作,则会很方便

我已生成初始化此数据的SQL脚本。脚本由行组成,每行包含一千条记录的插入操作。原因是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);
}
然而,在我的开发人员机器上使用SQLLocalDB实例几乎需要2分钟(在生产中使用的成熟的SQL Server上可能会更快,但是使用LocalDB进行开发很方便)


有什么方法可以让这个过程更快吗?

我们有一个类似的情况,我们在其中播种脚本。这是我们的代码。您不需要使用异步方法。它在几秒钟内就在本地播下了大约35000条记录

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

这是为了单元测试,所以它一直都在做?否则,2分钟的“一次性操作”听起来并不可怕。可能的重复我们处于开发早期,因此每次模型更改时都必须这样做,因为我们还没有开始使用迁移。当然,若并没有简单的方法使其更快,我总是可以创建一个较小版本的主数据,并在开发过程中使用它。