2016-07-04 9 views
1

Ich habe ein ASP.NET MVC 5-Projekt, und ich möchte eine bestimmte Tabelle in der Datenbank mit Informationen aus einer TSV-Datei füllen.Initialisieren Sie Datenbanktabelle aus vorhandenen TSV-Datei

Diese sind, was die ersten drei Zeilen der Datei wie folgt aussehen:

CAE_Num CAE_Description 
01111 Description 1 
01112 Description 2 

Also machte ich ein Modell/Klasse, die wie folgt aussieht:

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; 
    } 
} 
} 

Das Modell verfügt über eine Funktion enthält, die spaltet eine Zeichenfolge und erstellt daraus ein CAE-Objekt.

Um die Datenbank vor der Laufzeit zu füllen, entschied ich mich, die Seed-Methode in der Configuration-Klasse zu verwenden, die beim Aktivieren von Datenbankmigrationen erstellt wird. Ich habe dies in einem anderen Projekt zuvor für Benutzerrollen verwendet, also weiß ich, dass dies einer der richtigen Orte ist, an denen ich erreichen kann, was ich will. Also hier ist, was ich tat:

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(); 
    } 
} 
} 

Als ich update-database laufen bekomme ich den Fehler/Warnung:

Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

und mein Modell ist überhaupt nicht gefüllt, wenn ich zu localhost:xxxx/CAEs gehen, noch ist eine Information an die dbo.CAEs [Data] Tabelle hinzugefügt im Server-Explorer.

Ich frage mich, ob mein Problem mit dem Pfad zu der .tsv-Datei ist. Ich habe gegoogelt und ich habe gelesen, dass die Datei im App_Data-Ordner die Mühe macht, einen Dateipfad zu codieren.

+0

Ihr Problem ist null Httpcontext. http://stackoverflow.com/questions/19323437/how-to-get-file-path-in-entity-framework-seed-method-without-httpcontext-execut/20070329#20070329 –

+0

Debuggen Sie es: http: // stackoverflow .com/q/17169020/861716 –

+0

@SteveGreene Danke Steve, das hat funktioniert! – glhrmv

Antwort

0

Für alle, die dies in der Zukunft lesen, habe ich die Funktion von SteveGreene's link in der Configuration-Klasse, vor allen anderen Methoden. In dieser Funktion habe ich nur AbsolutePath zu LocalPath geändert.

Dann auf der Seed-Methode geändert ich die Linie

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

zu

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