2016-07-04 6 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.

Чтобы заполнить базу данных до ее выполнения, я решил использовать метод 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 избавляет меня от жесткого кодирования пути к файлу.

+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.

Тогда на методе Seed я изменил линию

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

в

List<CAE> listCAEs = File.ReadAllLines(MapPath("~/App_Data/CAE.tsv")) 
Смежные вопросы