it-swarm-pt.tech

É possível alterar a localização da pasta "Migrações" da EF Migrations?

Por padrão, o comando add-migration tenta criar o arquivo .cs de migração no

  • Raiz do projeto
    • Migrações

Gostaria de armazenar minhas migrações junto com o restante do código relacionado ao EF na pasta\Data do meu projeto:

  • Raiz do projeto
    • Dados
      • Migrações

Com essa estrutura, quando executo

PM> add-migration Migration1

no console do NuGet, recebo o seguinte erro:

 System.IO.DirectoryNotFoundException: não foi possível encontrar uma parte do caminho 'C:\MyProjectRoot\Migrations\201112171635110_Migration1.cs'. 
 Em System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) [.__ useLongPath) 
 em System.IO.FileStream..ctor (caminho da String, modo FileMode, acesso a FileAccess, compartilhamento FileShare, Int32 bufferSize, opções FileOptions) 
 em System.IO.StreamWriter.CreateFile (String caminho, anexo booleano) 
 em System.IO.StreamWriter..ctor (caminho da cadeia, anexo booleano, codificação de codificação, Int32 bufferSize) 
 em System.IO.StreamWriter..ctor (caminho da cadeia, Anexo booleano, codificação de codificação) 
 Em System.IO.File.InternalWriteAllText (caminho da cadeia, conteúdo da cadeia, codificação da codificação g) 
 em System.IO.File.WriteAllText (caminho da string, conteúdo da string) 

É possível especificar o local no disco em que o arquivo de migração deve ser criado ao executar o comando add-migration?

42
shrichards

No construtor da classe de configuração, adicione esta linha:

this.MigrationsDirectory = "DirOne\\DirTwo";

O espaço para nome continuará sendo definido como o espaço para nome da própria classe de configuração. Para mudar isso, adicione esta linha (também no construtor de configuração):

this.MigrationsNamespace = "MyApp.DirOne.DirTwo";
63
Roger

A especificação da pasta de migrações também é possível durante a chamada do enable-migrations comando (que cria a classe Configuration), usando o -MigrationsDirectory parâmetro:

enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName

O exemplo criará uma classe Configuration que define o MigrationsDirectory para a pasta especificada 'Migrations\CustomerDatabases' que é relativa à pasta raiz do projeto.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\CustomerDatabases";
}


Consulte também this artigo que explica sobre um projeto com vários contextos e pastas de migração.

A propósito, se você estiver usando várias pastas de migração e vários contextos, considere também configurar um nome para o esquema padrão no método OnModelCreating da sua classe derivada DbContext (onde o Fluent -A configuração do API é). Isso funcionará no EF6:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("CustomerDatabases");
    }

O prefixo das tabelas do banco de dados com o nome do esquema. Isso permitirá que você use mais de um contexto com um único banco de dados em um cenário em que você tenha vários grupos de tabelas independentes de outro. (Isso também criará versões separadas das tabelas MigrationHistory, no exemplo acima, seria CustomerDatabases.__MigrationHistory).

19
Martin