EF5: Não é possível anexar o arquivo '{0}' como banco de dados '{1}'

140

Estou encontrando o problema exato, conforme descrito aqui (leia a seção "Não é possível anexar ao arquivo MDF excluído"), mas a solução para o problema não é informada lá ...

Em resumo, o problema é que, após a exclusão do .mdfarquivo, a seguinte exceção é lançada quando tento acessar o banco de dados usando o EF 5.0.

DataException-> EntityException-> SqlException:
Não é possível anexar o arquivo '{0}' como banco de dados '{1}'

Excluí o arquivo DB e agora recebo essa mensagem de erro desagradável ao executar o aplicativo, esperando que ele use o inicializador. Algum jeito de arrumar isso?

Shimmy Weitzhandler
fonte
1
Desculpe por não fornecer uma resposta específica, mas na época eu não tinha uma solução que funcionasse 100% do tempo. Tento evitar o erro agora, não usando bancos de dados anexados pelo usuário. Geralmente, eu poderia corrigir o erro conectando-me ao SQL Server Management Studio e desanexando o banco de dados no erro.
OdeToCode
O problema é que o banco de dados não existe mais, pois eu já excluí o arquivo físico. Na verdade, tentei cuidar dele em um dos estúdios (integrado no VS e externo). Minha resposta realmente não é uma solução, mas uma solução alternativa, apenas informa que você não precisa se ater ao LocalDb.
Shimmy Weitzhandler (
Do especialista da EF Rowan Miller - consulte romiller.com/2013/05/05/17/… Esperamos fornecer melhores soluções na próxima versão do VS.
RickAndMSFT
Um guia útil para solução de problemas: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

Respostas:

220

Se você excluir o arquivo DB, ele ainda permanecerá registrado no SqlLocalDB. Às vezes, ele corrige a exclusão do banco de dados. Você pode fazer isso na linha de comando.

  1. Abra o "Propmpt de Comando do Desenvolvedor para VisualStudio" no menu Iniciar / Programas.
  2. Execute os seguintes comandos:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

CodingWithSpike
fonte
1
Não encontrei o Sql Server Object Explorer, acho que porque estou usando o VS 2012 Express. Portanto, não posso tentar a resposta aceita. No entanto, sua resposta funcionou perfeitamente para mim. Obrigado.
newman
3
Sua resposta acabou de me salvar. Eu não tinha o subnó (localdb) \ v11.0 da resposta aceita e não pude remover as referências do SQL Management Studio, então, viva para você!
Santux 31/07/2013
18
Isso funcionou para mim depois de excluir os arquivos. Você também pode executar os comandos em Ferramentas -> Gerenciador de Pacotes de Biblioteca -> Console do Gerenciador de Pacotes.
Bart Verkoeijen
11
Como uma observação lateral, v11.0é específico ao SQL LocalDB 2012. Se você estiver usando o LocalDB 2014, a MS o renomeou MSSqlLocalDb.
CodingWithSpike
4
em relação ao comentário acima, você também não pode inserir nenhum nome de banco de dados e ele será aplicado apenas ao nome padrão, usei abaixo com vs2015 e funcionou: sqllocaldb.exe stop sqllocaldb.exe delete
Deviney
147

Para quem ainda procura uma solução ...

Vá para View / SQL Server Object Explorer e exclua o banco de dados do subnó (localdb) \ v11.0!
insira a descrição da imagem aqui

Existe essencialmente um banco de dados local onde os arquivos devem estar e, se você deseja excluir os arquivos do banco de dados, remova-os deste utilitário do explorer, não manualmente.

JSobell
fonte
este bocado mim uma vez, a segunda vez foi que eu tinha auto migrações == false FML
workabyte
8
Além disso, se você não vê. Basta adicionar uma nova conexão e digite "(localdb) \ v11.0" (com autenticação do Windows). Pode parecer simples, mas fiquei olhando a tela por um tempo. :)
Peter
@ Peter Ok, Adicionado o banco de dados e agora vejo meus 2 contextos. Ao excluir desta exibição, recebo um novo erro: 'não é possível recuperar o nível de acesso a dados para este banco de dados'. Consegui contornar isso usando o prompt de comando.
NVentimiglia
1
Ao usar o connection factory padrão do EF6, você pode usar o mssqllocaldb. Mude o servidor para (LocalDb) \ mssqllocaldb e veja se isso se conecta. Existem várias versões do LocalDb e uma não mostra tudo.
Jim Yarbro 6/15
Além disso, o que experimentei: clique em desconectar e, em seguida, conecte-se novamente se você não vir mais o banco de dados. (Refresh não ajuda)
StefanG
19

Tentei a solução do JSobell primeiro, mas não vi meu banco de dados listado lá. Executei os comandos do CodingWithSpike no VS Developer Command Prompt, mas isso também não funcionou. Finalmente, executei os mesmos comandos do CodingWithSpike no Package Manager Console e funcionou.

    PM> sqllocaldb.exe stop v11.0
    LocalDB instance "v11.0" stopped.

    PM> 
    PM> sqllocaldb.exe delete v11.0
    LocalDB instance "v11.0" deleted.

    PM> sqllocaldb.exe start v11.0
    LocalDB instance "v11.0" started.
AJs
fonte
9

Tudo bem.

Minha solução foi simples, mudei para usar o servidor local:

Alterei o DataSourceatributo na cadeia de conexão de:

Data Source=(LocalDb)\v11.0;blah

Para:

Data Source=.\SQLEXPRESS;blah

Outra solução é fazer login no LocalDb via SQL Management Studio e tentar excluir esse banco de dados:

insira a descrição da imagem aqui

No entanto, não funcionou para mim, quando tento excluí-lo, diz "TITLE: Microsoft SQL Server Management Studio

O banco de dados '{0}' não existe no servidor. (SqlManagerUI)

Quando tento desanexá-lo, o banco de dados não aparece na lista para desanexar a seleção. "Colocar offline" também leva ao erro acima.

O que me leva a pensar que este é um bug sólido no LocalDB.

Shimmy Weitzhandler
fonte
Tenho problemas ao tentar usar DB local com EF5
Nikos
O LocalDB tem como benefício que você pode executá-lo na sua conta local sem a necessidade de privilégios de administrador, assim como o IIS Express. Isso permite compartilhar projetos com muitos desenvolvedores sem configurar o IIS ou o SQL Server para cada usuário individual.
Bart Verkoeijen
4

A correção mais fácil é simplesmente alterar o nome do seu banco de dados na cadeia de conexão. Consulte o blog Rowan Millers Como descartar um banco de dados do Visual Studio 2012 para obter soluções alternativas. Esperamos corrigir esse problema em uma edição futura.

RickAndMSFT
fonte
2

A melhor e mais fácil solução que acabei de resolver agora: basta usar o nome do servidor sql como fonte de dados, o catálogo inicial como o nome do banco de dados e remover a linha mdf

dotado
fonte
1

No meu caso, eu uso migrações e na configuração simplesmente mudei o nome da classe dataContext e dataContext (apenas renomeie) e tente novamente e isso ajudou

no0bassss
fonte
1

Para o SQL 2014, siga a resposta selecionada CodingWithSpike e este comentário

Como observação lateral, a v11.0 é específica do SQL LocalDB 2012. Se você estiver usando o LocalDB 2014, a MS renomeou para MSSqlLocalDb . - CodingWithSpike Ago 29 '14 às 19:20

Único
fonte
Nota útil, encontro esse trabalho em um projeto antigo com o VS 2015 Mais informações . Também há alterações semelhantes no VS 2013 de v11.0para ProjectsV12 . Pelo menos na minha máquina :-).
objectivo
0

Eu tive o mesmo problema e o resolvi definindo manualmente a pasta "DataDirectory" para outra pasta nos binários do meu aplicativo.

Coloquei esta linha no método Global.asax Application_Start:

AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

Minha cadeia de conexão está atualmente definida como esta:

<connectionStrings>
    <add name="DataContext" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DataContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DataContext.mdf"
  providerName="System.Data.SqlClient" />

Filipe Scur
fonte
Não testei, mas isso provavelmente não deve funcionar. porque DataDirectoryjá está definido como local App_Datapor padrão, portanto, a menos que seja explicitamente alterado antes, seu código não fará nada.
Shimmy Weitzhandler
Se você seguir essa abordagem, não altere o diretório, altere o nome do arquivo MDF. Além disso, consulte romiller.com/2013/05/17/…
RickAndMSFT
0

Eu poderia corrigi-lo renomeando o nome do DataBase na minha conexão String, do padrão aspnet- {numbers} para um nome simples, funcionou.

Edgar Salazar
fonte
0

Conecte-se a (LocalDb) \ v11.0 usando o Sql server management studio, exclua o banco de dados e faça um banco de dados de atualização no console do gerenciador de pacotes.

Nidhin
fonte
0

Eu tive o mesmo problema. Executei os seguintes comandos no console do gerenciador de pacotes e ele corrigiu o problema

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Tony Newsom
fonte