首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从现有的.tsv文件初始化数据库表

从现有的.tsv文件初始化数据库表
EN

Stack Overflow用户
提问于 2016-07-04 17:14:23
回答 1查看 299关注 0票数 1

我有一个ASP.NET MVC 5项目,我想用.tsv文件中的信息填充数据库中的某个表。

文件的前3行如下所示:

代码语言:javascript
运行
复制
CAE_Num CAE_Description
01111   Description 1
01112   Description 2

所以我做了一个模型/类,如下所示:

代码语言:javascript
运行
复制
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方法。我以前在一个不同的项目中使用过它,用于用户角色,所以我知道这是我可以实现我想要的东西的正确地方之一。我就是这样做的:

代码语言:javascript
运行
复制
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文件夹中可以省去硬编码文件路径的麻烦。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 21:11:06

对于将来阅读这篇文章的人,我将来自SteveGreene's link的函数放在Configuration类中,高于所有其他方法。在这个函数中,我只将AbsolutePath更改为LocalPath

然后在种子法上我换了行

代码语言:javascript
运行
复制
List<CAE> listCAEs = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/App_Data/CAE.tsv")) 

代码语言:javascript
运行
复制
List<CAE> listCAEs = File.ReadAllLines(MapPath("~/App_Data/CAE.tsv"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38189584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档