Заполнить таблицу в рамках сущности рамочной миграции

StackOverflow https://stackoverflow.com//questions/20028878

Вопрос

Один из моих миграций EF создает таблицу и как часть метода Migration 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