2016-07-04 74 views
1

我有一個ASP.NET MVC 5項目,我想用.tsv文件中的信息填充數據庫中的某個表。從現有的.tsv文件初始化數據庫表

這些文件的前3行是什麼樣子:

CAE_Num CAE_Description 
01111 Description 1 
01112 Description 2 

所以我做了一個模型/類,它看起來像這樣:

namespace project.Models 
{ 
public class CAE 
{ 
    public int Id { get; set; } // id 

    public int CAE_Num { get; set; } 
    public string CAE_Description { get; set; } 

    public static CAE FromTsv(string tsvLine) 
    { 
     string[] values = tsvLine.Split('\t'); 

     CAE cae = new CAE(); 
     cae.CAE_Num = Convert.ToInt32(values[0]); 
     cae.CAE_Description = Convert.ToString(values[1]); 

     return cae; 
    } 
} 
} 

該模型包括一個分割功能一個字符串並基於它創建一個CAE對象。

爲了在運行時填充數據庫,我決定在啓用數據庫遷移時創建的Configuration類中使用Seed方法。我之前在一個不同的項目中使用過它,對於用戶角色,所以我知道這是我可以實現我想要的一個正確位置。 因此,這裏是我所做的:

namespace project.Migrations 
{ 
using System; 
using System.Data.Entity; 
using System.Data.Entity.Migrations; 
using System.Linq; 
using project.Models; 
using System.IO; 
using System.Collections.Generic; 
using System.Web; 

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(ApplicationDbContext context) 
    { 
     List<CAE> listCAEs = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/App_Data/CAE.tsv")) // reads all lines into a string array 
       .Skip(1) // skip header line 
       .Select(f => CAE.FromTsv(f)) // uses Linq to select each line and create a new Cae instance using the FromTsv method. 
       .ToList(); // converts to type List 

     listCAEs.ForEach(s => context.CAEs.Add(s)); 
     context.SaveChanges(); 
    } 
} 
} 

當我運行update-database我得到的錯誤/警告:不設置到對象的實例

對象引用。

和我的模型不填充在所有的時候我去localhost:xxxx/CAEs,也不是加入dbo.CAEs [Data]表中的服務器資源管理器的任何信息。

我想知道如果我的問題是與.tsv文件的路徑。我搜索了一下,並且我讀了讓App_Data文件夾中的文件爲我省去了硬編碼文件路徑的麻煩。

+0

你的問題是空的HttpContext。 http://stackoverflow.com/questions/19323437/how-to-get-file-path-in-entity-framework-seed-method-without-httpcontext-execut/20070329#20070329 –

+0

調試它:http:// stackoverflow .com/q/17169020/861716 –

+0

@SteveGreene謝謝史蒂夫,工作! – glhrmv

回答

0

對於任何未來讀者來說,我將SteveGreene's link中的函數放在配置類中,高於所有其他方法。在此功能中,我只將AbsolutePath更改爲LocalPath

然後在種子法我改了行

List<CAE> listCAEs = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/App_Data/CAE.tsv")) 

List<CAE> listCAEs = File.ReadAllLines(MapPath("~/App_Data/CAE.tsv"))