EF迁移使用大型数据集进行种子设定

时间:2014-09-06 02:45:41

标签: asp.net-mvc ef-migrations

我在ASP.NET MVC5项目中使用EF Code First Migration。我想用大约5000条记录为数据库播种。 asp.net网站和博客上的示例都在配置方法中具有种子功能。

internal sealed class Configuration : DbMigrationsConfiguration<foo.ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        MigrationsDirectory = @"Migrations\ApplicationDbContext";
    }

    protected override void Seed(foo.ApplicationDbContext context)
    {

        SeedProducts(context);
        SeedFoods(context);


        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

使用EF迁移时,有哪些选项可以播种大型数据集?

目前配置文件超过5000行,与管理不同。

我更愿意将它们存储在另一个数据库或Excel电子表格中,然后使用种子函数将它们导入。我不确定如何在Seed方法中从外部源导入数据。

我还尝试将数据集分成几个文件,但是当我尝试调用函数

 SeedProducts(context);
 SeedFoods(context);

在配置类之外我得到一个构建错误:&#34;该名称在当前上下文中不存在&#34;。 (我不确定这意味着什么?

3 个答案:

答案 0 :(得分:2)

您可以将sql文件存储在基目录中并使用它。您可以创建多个sql文件。我使用以下代码来执行存储在基本目录中的所有sql文件。

protected override void Seed(CRM.Data.DbContexts.CRMContext context)
        {


          var sqlfiles = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory+"\\initialdata", "*.sql");
          sqlfiles.ToList().ForEach(x=> context.Database.ExecuteSqlCommand(File.ReadAllText(x)));

        }

答案 1 :(得分:1)

为什么我们需要拥有5000条记录的种子数据。如果您更喜欢这种方式,也需要大量的手工操作。在哪里,这里不需要。

您可以立即创建脚本并将其执行到您的数据库中。通过代码和手动。

Db脚本可以用于整个数据库以及每个表,也可以采用存储过程。所以,你会特别得到记录。

按照this linkMSDN

中的步骤操作

注意:创建数据库脚本后。您可以从种子功能中读取文件并从功能本身执行查询。 手动,您可以在需要时随时执行。

答案 2 :(得分:1)

我最终使用CSV(逗号分隔文件)并将其存储为域资源。然后读取CSV文件并添加数据库记录:

我可以使用EF Migration Seed method and a CSV file对数据库建立种子,如下所述在Migration.cs文件中。注意:Visual Studio中项目中的CSV文件设置为“对嵌入式资源构建操作”。

public void SeedData(WebApp.Models.ApplicationDbContext Context)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        string resourceName = "WebApp.SeedData.Name.csv";
        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        {
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
            {
                CsvReader csvReader = new CsvReader(reader);
                csvReader.Configuration.WillThrowOnMissingField = false;
                var records = csvReader.GetRecords<Products>().ToArray();

                foreach (Product record in records)
                {                            
                      Context.Products.AddOrUpdate(record); 
                }
            }
        }
        Context.SaveChanges();
    }