实体框架迁移中的填充表
-
21-12-2019 - |
题
我的一个 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# 中打印源文件名和行号.
不隶属于 StackOverflow