C# - 实体框架 - 大量种子数据的代码优先

3
我将在我的应用程序中创建一个初始表来存储我国所有城市/州的数据。这是一个相对较大的数据集:5k+注册。
阅读this post让我了解到一种很好的方法,尽管我认为留下一个SQL文件并由EF导入是一种安全漏洞。
文件格式不重要:我可以将其制作为XLS或TXT;与帖子中所示的执行它作为SQL命令不同,我可以简单地将其读取为流并生成如下超链接中教程所示的对象。
阅读this tutorial有关代码优先数据种子的内容,我看到种子方法将在数据库初始化过程中执行,并且种子对象是在种子方法中生成的。 我的问题: 关于种子方法,哪种方法更好,SQL文件方法还是对象方法? 我个人认为对象方法更安全,但可能会更慢,这可能引发我的第二个问题: 在数据库初始化过程中执行的种子方法,仅在创建DB时执行?这对我来说有点不清楚。
谢谢。

当创建数据库或运行数据库迁移时,Seed方法会被执行,如果您需要添加5k个实体,则可能会变得非常缓慢。我建议使用SQL文件,因为它的执行速度更快。当我使用EF添加大型对象集时,我必须在添加了约100个实体后将更改提交到数据库,以便添加下一个实体不会花费太多时间(尽管这是使用EF 4时的情况)。 - Vsevolod Goloviznin
你没有说明你使用的是哪个数据库。但是如果你使用的是Sql Server,你应该考虑使用Bulk Copy或bcp.exe来加载你的数据库。这是最快的加载数据库的方法。 - Mike Burdick
1个回答

3
  1. Reference System.Data in your database project and add the NuGet package EntityFramework.BulkInsert.

  2. Insert your data in the seed method if you detect that it's not there yet:

    protected override void Seed(BulkEntities context)
    {
        if (!context.BulkItems.Any())
        {
            var items = Enumerable.Range(0, 100000)
                      .Select(s => new BulkItem
                      {
                          Name = s.ToString(),
                          Status = "asdf"
                      });
    
            context.BulkInsert(items, 1000);                
        }
    }
    

在这里插入10万个项目大约需要3秒钟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接