У меня есть проект 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.
Чтобы заполнить базу данных до ее выполнения, я решил использовать метод Seed в классе Configuration, созданный при включении миграции базы данных. Я использовал это в другом проекте раньше, для пользовательских ролей, поэтому я знаю, что это одно из правильных мест, в которых я могу достичь того, чего хочу. Так вот что я сделал:
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. Я googled, и я читал, что наличие файла в папке 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