Como habilito as migrações do Entity Framework 5 (versão 5.0.0) para vários contextos de banco de dados no mesmo projeto, em que cada contexto corresponde ao seu próprio banco de dados? Quando executo Enable-Migrations
no console PM (Visual Studio 2012), ocorre um erro devido a vários contextos:
PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.
Se eu executar, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
não tenho permissão para executar Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
porque já existe uma migração:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Respostas:
A segunda chamada para Enable-Migrations está falhando porque o arquivo Configuration.cs já existe. Se você renomear essa classe e arquivo, poderá executar a 2ª Enable-Migrations, que criará outro Configuration.cs.
Você precisará especificar qual configuração deseja usar ao atualizar os bancos de dados.
fonte
Além do que o @ckal sugeriu, é essencial atribuir a cada Configuration.cs renomeado seu próprio espaço para nome. Caso contrário, a EF tentará aplicar migrações ao contexto errado.
Aqui estão as etapas específicas que funcionam bem para mim.
Se as migrações estiverem erradas e você desejar criar uma nova "linha de base":
Criando a migração inicial:
No Console do Gerenciador de Pacotes:
No Gerenciador de Soluções: Renomeie Migrations.Configuration.cs para Migrations.ConfigurationA.cs. Isso deve renomear automaticamente o construtor se estiver usando o Visual Studio. Certifique-se de que sim. Editar ConfigurationA.cs: altere o namespace para NamespaceOfContext.Migrations.MigrationsA
No Solution Explorer: Renomeie Migrations.Configuration.cs para Migrations.ConfigurationB.cs. Novamente, verifique se o construtor também foi renomeado adequadamente. Editar ConfigurationB.cs: altere o espaço para nome para NamespaceOfContext.Migrations.MigrationsB
Etapas para criar scripts de migração no Console do Gerenciador de Pacotes:
Comando de execução
ou -
Não há problema em executar novamente este comando até que as alterações sejam aplicadas ao banco de dados.
Execute os scripts no banco de dados local desejado ou execute o Update-Database sem -Script para aplicar localmente:
ou -
fonte
Acabei de encontrar o mesmo problema e usei a seguinte solução (todas do Package Manager Console)
Isso criará 2 pastas separadas na pasta Migrações. Cada um conterá o
Configuration.cs
arquivo gerado . Infelizmente, você ainda precisa renomear essesConfiguration.cs
arquivos, caso contrário, haverá reclamações sobre a existência de dois deles. Renomeei meus arquivos paraConfigA.cs
eConfigB.cs
EDIT : (cortesia de Kevin McPheat) Lembre-se de renomear os arquivos Configuration.cs, renomeie também os nomes de classe e os construtores / EDIT
Com essa estrutura você pode simplesmente fazer
O que criará os arquivos de código para a migração dentro da pasta ao lado dos arquivos de configuração (é bom manter esses arquivos juntos)
E por último, mas não menos importante, esses dois comandos aplicarão as migrações corretas aos bancos de dados correspondentes.
EDIT 08 Fev 2016: Fiz um pequeno teste com o EF7 versão 7.0.0-rc1-16348
Não foi possível obter a opção -o | --outputDir para funcionar. Continuou dando
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
No entanto, parece que na primeira vez em que uma migração é adicionada, ela é adicionada à pasta Migrações e uma migração subsequente para outro contexto é automaticamente colocada em uma subpasta de migrações.
Os nomes originais
ContextA
parecem violar algumas convenções de nomenclatura, então agora eu uso oContextAContext
eContextBContext
. Usando esses nomes, você pode usar os seguintes comandos: (observe que meu dnx ainda funciona no console do gerenciador de pacotes e não gosto de abrir uma janela CMD separada para fazer migrações)Isso criará um instantâneo do modelo e uma migração inicial na
Migrations
pasta paraContextAContext
. Ele criará uma pasta chamadaContextB
contendo esses arquivos paraContextBContext
Adicionei manualmente uma
ContextA
pasta e movi os arquivos de migraçãoContextAContext
para essa pasta. Renomeei o nome do namespace dentro desses arquivos (arquivo de instantâneo, migração inicial e observe que há um terceiro arquivo no arquivo de migração inicial ... designer.cs). Eu tive que adicionar.ContextA
ao espaço para nome e a partir daí a estrutura lida com ele automaticamente novamente.O uso dos seguintes comandos criaria uma nova migração para cada contexto
e os arquivos gerados são colocados nas pastas corretas.
fonte
add-migration
será solicitadoName
. Isso me assustou um pouco, já que eu já estava fornecendoConfigurationTypeName
e fiquei um pouco irritado quando acabou de dizerName:
. Mas é claro que o Nome que ele quer é a descrição 'legível por humanos' da mudança - por exemplo.AddedProducts
ouIncreaseLengthOfNameFields
. Na pasta Migrações, você obtém isso como parte do nome da classe, portanto é fácil ver o que é o quê. Então, na verdade,Name
é como um comentário de check-in.Caso você já tenha uma "Configuração" com muitas migrações e queira mantê-la como está, sempre poderá criar uma nova classe "Configuração", com outro nome, como
então apenas emita o comando
e a EF acompanhará a migração sem problemas. Finalmente, atualize seu banco de dados; a partir de agora, a EF reclamará se você não informar a ele qual configuração você deseja atualizar:
Feito.
Você não precisa lidar com Enable-Migrations, pois ele reclamará que "Configuração" já existe e renomear sua classe de configuração existente trará problemas ao histórico de migração.
Você pode segmentar bancos de dados diferentes, ou o mesmo, todas as configurações compartilharão a tabela __MigrationHistory de maneira agradável.
fonte
Se houver mais bancos de dados, use os seguintes códigos no PowerShell
'Starter' é o nome da migração
'EnrollmentAppContext' é o nome do meu aplicativo
Você pode abrir o PowerShell no VS fazendo o seguinte:
Tools->NuGet Package Manager->Package Manager Console
fonte
Para atualizar o tipo de banco de dados a seguir nos códigos do PowerShell ...
* se houver mais de um banco de dados, use apenas esses códigos; caso contrário, não será necessário.
fonte
Na verdade, o EF 4.7 dá uma dica quando você executa Enable-migrations em múltiplos contextos.
Mais de um tipo de contexto foi encontrado no assembly 'Service.Domain'.
fonte