我在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;。 (我不确定这意味着什么?
答案 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脚本可以用于整个数据库以及每个表,也可以采用存储过程。所以,你会特别得到记录。
中的步骤操作注意:创建数据库脚本后。您可以从种子功能中读取文件并从功能本身执行查询。 或手动,您可以在需要时随时执行。
答案 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();
}