【问题标题】:Initialize database table from existing .tsv file从现有的 .tsv 文件初始化数据库表
【发布时间】:2016-11-06 11:21:26
【问题描述】:

我有一个 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 文件夹中可以省去硬编码文件路径的麻烦。

【问题讨论】:

标签: c# asp.net entity-framework


【解决方案1】:

对于将来阅读本文的任何人,我将来自 SteveGreene's link 的函数放在 Configuration 类中,高于所有其他方法。在这个函数中,我只将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"))

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 2013-06-08
    • 2021-11-27
    • 2013-01-13
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多