EF5: No se puede adjuntar el archivo '{0}' como base de datos '{1}'


140

Me encuentro con el problema exacto como se describe aquí (lea la sección "No se puede adjuntar a un archivo MDF eliminado"), pero la solución al problema no se dice allí ...

En resumen, el problema es que después de eliminar el .mdfarchivo, se produce la siguiente excepción cuando intento acceder a la base de datos utilizando EF 5.0.

DataException-> EntityException-> SqlException:
no se puede adjuntar el archivo '{0}' como base de datos '{1}'

Eliminé el archivo DB y ahora recibo ese desagradable mensaje de error cuando ejecuto la aplicación esperando que use su inicializador. Cualquier forma de arreglar esto?


1
Lo siento, no proporcioné una respuesta específica, pero en ese momento no tenía una solución que funcionara el 100% del tiempo. Intento evitar el error ahora al no usar las bases de datos adjuntas del usuario. En general, podría solucionar el error conectándome con SQL Server Management Studio y desconectando la base de datos en el error.
OdeToCode

El problema es que la base de datos ya no existe, ya que eliminé el archivo físico. En realidad intenté cuidarlo en uno de los estudios (integrado en VS y externo). Mi respuesta realmente no es una solución, sino una solución alternativa, solo dice que no tiene que atenerse a LocalDb.
Shimmy Weitzhandler

Del experto en EF, Rowan Miller, visite romiller.com/2013/05/17/… Esperamos ofrecer mejores soluciones en la próxima versión de VS.
RickAndMSFT

Una guía útil para la resolución de problemas: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

Respuestas:


220

Si elimina el archivo DB, aún permanece registrado con SqlLocalDB. A veces lo arregla para eliminar la base de datos. Puedes hacer esto desde la línea de comando.

  1. Abra el "Propósito de comando de desarrollador para VisualStudio" en el menú de inicio / programas.
  2. Ejecute los siguientes comandos:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
No encontré Sql Server Object Explorer, supongo porque estoy usando VS 2012 Express. Entonces, no puedo probar la respuesta aceptada. Sin embargo, su respuesta funcionó para mí perfectamente. Gracias.
newman

3
Tu respuesta me salvó. No tenía el subnodo (localdb) \ v11.0 de la respuesta aceptada y no pude eliminar las referencias de SQL Management Studio, ¡así que apúrate!
Santux

18
Esto funcionó para mí después de eliminar los archivos. También puede ejecutar los comandos desde Herramientas -> Administrador de paquetes de biblioteca -> Consola de administrador de paquetes.
Bart Verkoeijen

11
Como nota al margen, el v11.0es específico de SQL LocalDB 2012. Si está utilizando LocalDB 2014, MS lo renombró en su MSSqlLocalDblugar.
CodingWithSpike

44
en relación con el comentario anterior, tampoco puede ingresar ningún nombre de base de datos y solo se aplicará a su nombre predeterminado, utilicé a continuación con vs2015 y funcionó: sqllocaldb.exe detener sqllocaldb.exe eliminar
Deviney

147

Para aquellos que todavía buscan una solución ...

¡Vaya a Ver / Explorador de objetos de SQL Server y elimine la base de datos del subnodo (localdb) \ v11.0!
ingrese la descripción de la imagen aquí

Esencialmente hay una base de datos local retenida de dónde deberían estar los archivos, y si desea eliminar los archivos de la base de datos, asegúrese de eliminarlos de esta utilidad del explorador, no manualmente.


esto me mordió una vez, la segunda vez fue que tuve migraciones automáticas == false FML
workabyte

8
Además, si no lo ves. Simplemente agregue una nueva conexión e ingrese "(localdb) \ v11.0" (con Windows Auth). Puede parecer simple, pero estuve mirando mi pantalla por un tiempo allí. :)
Peter

@ Peter Ok, agregué la base de datos y ahora veo mis 2 contextos. Cuando borro de esta vista, aparece un nuevo error: 'no se puede recuperar el nivel de acceso a datos para esta base de datos'. Pude evitar esto usando el símbolo del sistema.
nVentimiglia

1
Cuando use la fábrica de conexiones predeterminada de EF6, puede estar usando mssqllocaldb en su lugar. Cambie el servidor a (LocalDb) \ mssqllocaldb y vea si eso se conecta. Hay varias versiones de LocalDb, y una no muestra todas.
Jim Yarbro

Además, lo que experimenté: haga clic en desconectar y luego vuelva a conectarse si ya no ve su base de datos. (Actualizar no ayuda)
StefanG

19

Primero probé la solución de JSobell pero no vi mi base de datos listada allí. Ejecuté los comandos de CodingWithSpike desde el símbolo del sistema de desarrollador VS, pero tampoco funcionó. Finalmente ejecuté los mismos comandos de CodingWithSpike desde Package Manager Console y funcionó.

    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.

9

Bien.

Mi solución era simple, cambié para usar el servidor local:

Cambié el DataSourceatributo en la cadena de conexión de:

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

A:

Data Source=.\SQLEXPRESS;blah

Otra solución es iniciar sesión en LocalDb a través de SQL Management Studio e intentar eliminar esa base de datos:

ingrese la descripción de la imagen aquí

Sin embargo, no funcionó para mí, cuando trato de eliminarlo dice "TÍTULO: Microsoft SQL Server Management Studio

La base de datos '{0}' no existe en el servidor. (SqlManagerUI)

Cuando trato de desconectarlo, la base de datos no aparece en la lista para la selección de desconexión, "Desconectar" también me lleva al error anterior.

Lo que me lleva a pensar que este es un error sólido en LocalDB.


Tengo problemas para tratar de utilizar DB local con EF5
Nikos

LocalDB tiene el beneficio de que puede ejecutarlo en su cuenta local sin la necesidad de privilegios de administrador, al igual que IIS Express. Esto permite compartir proyectos con muchos desarrolladores sin configurar IIS o SQL Server para cada usuario individual.
Bart Verkoeijen


2

La mejor y más fácil respuesta La acabo de resolver ahora, solo use su nombre de servidor sql como fuente de datos, el catálogo inicial será el nombre de su base de datos y allí eliminará la línea mdf


1

En mi caso, uso migraciones y en la configuración simplemente cambié el nombre de dataContext y la clase dataContext en sí (solo renombre), luego intente nuevamente y eso ayudó


1

Para SQL 2014, siga la respuesta seleccionada CodingWithSpike y este comentario

Como nota al margen, la v11.0 es específica de SQL LocalDB 2012. Si está utilizando LocalDB 2014, MS cambió su nombre a MSSqlLocalDb . - CodingWithSpike 29 de agosto de 14 a 19:20


Nota al margen útil, encuentro esto trabajando en un proyecto antiguo con VS 2015 Más información . También hay cambios similares en VS 2013 de v11.0a ProjectsV12 . Al menos en mi máquina :-).
aspirar

0

Tuve el mismo problema y lo resolví configurando manualmente la carpeta "DataDirectory" en otra carpeta en los binarios de mi aplicación.

Puse esta línea en el método Global.asax Application_Start:

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

Mi cadena de conexión está configurada actualmente para esto:

<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" />


No lo probé, pero esto probablemente no debería funcionar. porque DataDirectoryya está configurado en el local App_Datade forma predeterminada, por lo que, a menos que se haya cambiado explícitamente antes, su código no hace nada.
Shimmy Weitzhandler

Si sigue este enfoque, no cambie el directorio, cambie el nombre del archivo MDF. TAMBIÉN, vea romiller.com/2013/05/17/…
RickAndMSFT

0

Podría solucionarlo renombrando el nombre de DataBase en mi cadena de conexión, desde la aspnet predeterminada {números} a un nombre simple, funcionó.


0

Conéctese a (LocalDb) \ v11.0 usando Sql server management studio, elimine el db y luego haga una base de datos de actualización en la consola del administrador de paquetes.


0

Yo tuve el mismo problema. Ejecuté los siguientes comandos en la consola del administrador de paquetes y solucionó el problema

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.