2011-11-23 12 views
6

que tienen una pequeña aplicación MVC 3 utilizando código de Entity Framework En primer lugar y utilizar esta cadena de conexión para el modelo:de Entity Framework Código de primer y cadenas de conexión

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal 

Cuando hago un cambio en el modelo (por ejemplo, añadir una propiedad), me sale como esperaba

El modelo que respalda el contexto 'JournalContext' ha cambiado desde que se creó la base de datos.

De modo que, estando en modo de desarrollo, procedo y elimino Journal.mdf y Journal.ldf.

Ahora en que funciono de nuevo la aplicación, me sale

no base de datos abierta "MyJournal" ¿Puede solicitada por el inicio. El inicio de sesión ha fallado.

Si cambio de cadena de conexión a

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal2 

(cambió el parámetro Database= añadiendo '2')

se crea Journal.mdf y la aplicación funciona de nuevo. Si realizo una serie de cambios e intento "reciclar" cualquier nombre de base de datos nuevamente, aparece el error "No se puede abrir".

¿Por qué necesito proporcionar un nombre de base de datos único cada vez que cambio el modelo, y cómo puedo "limpiar" los nombres anteriores?

+0

¿Está reiniciando la aplicación después de eliminar la base de datos? – StriplingWarrior

+0

@StriplingWarrior: Sí, lo soy. Recibo el error al volver a iniciar la aplicación. –

Respuesta

6

No necesita un nombre de base de datos único cada vez. Cuando se crea un modelo por primera vez, ejecuta un DatabaseInitializer para hacer cosas como crear la base de datos si no está allí o agregar datos iniciales. El DatabaseInitializer predeterminado intenta comparar el esquema de base de datos necesario para usar el modelo con un hash del esquema almacenado en una tabla EdmMetadata que se crea con una base de datos (cuando Code First es el que crea la base de datos). Si la comparación de hash es diferente, arroja ese error.

Obviamente, si cambia la cadena de conexión, creará una base de datos completamente nueva llamada 'MyJournal2'.

Formas de evitar esto son eliminar la tabla EdmMetadata y ejecutar el inicializador de nuevo. Puede hacerlo accediendo a la ventana del Explorador de bases de datos en Visual Studio y conectándose a su base de datos, luego vaya a Tablas donde debe encontrar la tabla EdmMetadata, haga clic derecho sobre ella y seleccione Eliminar.

Alternativamente poner

DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<dbType>()); 

en su método de Application_Start en Global.asax.cs. Esto eliminará la base de datos y la volverá a crear cada vez que cambie el esquema.

Consulte this video on pluralsight para obtener más información, especialmente la sección 'Cuando las clases cambian'.

También consulte este enlace para DropCreateDatabaseIfModelChanges. Le informa sobre lo que realmente sucede y cómo sembrar la base de datos si lo necesita creando una clase derivada.

+0

¿Por qué recibo el error de "permiso denegado" cuando elimino el archivo .mdf? ¿Dónde está la tabla EdmMetadata si no está en el archivo .mdf eliminado? –

+0

He actualizado mi respuesta sobre cómo eliminar la tabla EdmMetadata. Le recomiendo que vea el video al que me he vinculado, le dice todo lo que necesita saber. Puede obtener un error de "permiso denegado" por varias razones, una de ellas es que el servidor web aún se está ejecutando y accediendo a esa base de datos. – link664

+0

Y sí, hubiera supuesto que si eliminaba el archivo .mdf, la base de datos debería haberse eliminado, incluida la tabla EdmMetadata. ¿Cómo está borrando la base de datos? A través de un administrador de SQL Express? – link664

Cuestiones relacionadas