我有一個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文件夾中的文件爲我省去了硬編碼文件路徑的麻煩。
你的問題是空的HttpContext。 http://stackoverflow.com/questions/19323437/how-to-get-file-path-in-entity-framework-seed-method-without-httpcontext-execut/20070329#20070329 –
調試它:http:// stackoverflow .com/q/17169020/861716 –
@SteveGreene謝謝史蒂夫,工作! – glhrmv