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.
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 –
Debuggen Sie es: http: // stackoverflow .com/q/17169020/861716 –
@SteveGreene Danke Steve, das hat funktioniert! – glhrmv