質問

私のEF移行の1つはテーブルを作成し、移行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");
    }
}
.

Package Managerコンソールからマシン上で正しく機能します。ただし、開発チーム全体がこれを簡単に使用できるように、ファイルの相対パスを使用します。

単にファイル名を書きました更新に失敗しました。現在のディレクトリをファイル名に連結しようとしたとき、私は現在のディレクトリが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#のソースファイル名とLineNumberを印刷します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top