Pergunta

Uma das minhas migrações EF cria uma tabela e como parte da migração Up método eu gostaria de preencher esta tabela com dados iniciais.

Aqui está minha classe de migração:

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");
    }
}

Isso funciona corretamente em minha máquina no Console do Gerenciador de Pacotes.No entanto, gostaria de usar um caminho relativo para o arquivo, para que toda a equipe de desenvolvimento possa usá-lo facilmente.

Quando simplesmente escrevi o nome do arquivo, a atualização falhou.Quando tentei concatenar o diretório atual com o nome do arquivo, vi que o diretório atual era c:\windows\system32.

Como posso fazer a atualização ser executada no diretório do projeto ou da solução?

Alternativamente, existe uma maneira melhor de preencher a tabela durante uma atualização?Eu não quero usar o Seed método porque ele não faz exatamente o que eu quero.Por exemplo, há apenas um único Seed método enquanto desejo escrever código diferente para migrações diferentes.

Foi útil?

Solução

Como um Gambiarra você pode obter o caminho para o arquivo de origem atual e, em seguida, inserir o caminho relativo do arquivo CSV com dados.

Significado em vez de:

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

Tenha algo como:

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

Aqui estão alguns exemplos de como exatamente obter acesso ao caminho do arquivo de origem - Imprima o nome do arquivo de origem e o número da linha em C#.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top