2014-09-06 50 views
1

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

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

外的配置类,我收到了生成错误的:“这个名字并不存在于当前情境“。 (我不知道这是什么意思?

+0

为什么不最初种子数据库(因为你已经有一个工作种子功能),然后保存一个备份(或备份脚本),然后运行(新)种子函数内该脚本?您可以尽快从Web API或搜索引擎获取数据库,因为您可以“手动”。 – jpaugh 2014-09-06 02:49:18

回答

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

为什么我们需要有一个种子数据为5000条记录。如果你喜欢这种方式,将需要大量的体力劳动也。凡为,它在这里不是必需的。

即刻就可以创建脚本和执行即通过代码以及手动输入你的分贝。

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

按照以下步骤从this link OR MSDN

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

1

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

我能够在Migration.cs文件中使用EF Migration Seed method and a CSV file定义如下的数据库。注意:Visual Studio项目中的CSV文件被设置为Build Action to Embedded Resource。

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