我的一个 EF 迁移创建了一个表并作为迁移的一部分 Up 方法 我想用初始数据填充此表。

这是我的迁移课程:

public partial class Objects : DbMigration
{
    void Fill(string table, string path, string fieldTerminator = ",", string rowTerminator = @"\n")
    {
        Sql(string.Format("BULK INSERT {0} FROM '{1}' WITH (FIELDTERMINATOR = '{2}', ROWTERMINATOR = '{3}')", table, path, fieldTerminator, rowTerminator));
    }

    public override void Up()
    {
        CreateTable(
            "dbo.Objects",
            c => new
                {
                    ObjectId = c.Int(nullable: false),
                    Name = c.String(),
                    Location_X = c.Double(nullable: false),
                    Location_Y = c.Double(nullable: false),
                    Location_Z = c.Double(nullable: false),
                })
            .PrimaryKey(t => t.ObjectId);

        Fill("dbo.Objects", @"C:\temp\Scratch\Junk\ConsoleApplication3\data\objects.csv");
    }

    public override void Down()
    {
        DropTable("dbo.Objects");
    }
}

这可以通过包管理器控制台在我的计算机上正常运行。不过,我想使用该文件的相对路径,以便整个开发团队可以轻松使用它。

当我简单地写入文件名时,更新失败。当我尝试将当前目录连接到文件名时,我看到当前目录是 c:\windows\system32。

如何从项目或解决方案目录运行更新?

或者,是否有更好的方法在更新期间填充表格?我不想使用 Seed 方法,因为它并不完全符合我的要求。例如,只有一个 Seed 方法,而我想为不同的迁移编写不同的代码。

有帮助吗?

解决方案

作为一个 解决方法 您可以获取当前源文件的路径,然后输入包含数据的 CSV 文件的相对路径。

含义代替:

dataFile = @"C:\temp\Scratch\Junk\ConsoleApplication3\data\objects.csv";

有类似的东西:

currentFile = GetSourceFilePath(); // See below hints for implementation
dataFile = Path.Combine(
    Path.GetDirectoryName(currentFile),
    @"..\data\objects.csv"
);

以下是如何准确访问源文件路径的一些示例 - 在 C# 中打印源文件名和行号.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top