从现有的.tsv文件初始化数据库表
本文关键字:初始化 数据库 文件 tsv | 更新日期: 2023-09-27 17:55:08
我有一个ASP。NET MVC 5项目,我想用.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文件夹中可以省去硬编码文件路径的麻烦。
对于将来阅读本文的人,我将StevenGreene链接中的函数放在了Configuration类中,高于所有其他方法。在这个函数中,我只将AbsolutePath
更改为LocalPath
。
然后在种子方法上,我更改了
List<CAE> listCAEs = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/App_Data/CAE.tsv"))
至
List<CAE> listCAEs = File.ReadAllLines(MapPath("~/App_Data/CAE.tsv"))