2014-09-06 62 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(); 
    }