Error solo en el código de Entity Framework: el modelo que respalda el contexto ha cambiado desde que se creó la base de datos

Creé un POCO “Sólo código” para su uso en una base de datos existente que utiliza Entity Framework 4 y CTP4. Cuando ejecuto una consulta obtengo el error

El modelo que respalda el contexto ‘xyzContext’ ha cambiado desde que se creó la base de datos. Elimine / actualice manualmente la base de datos o llame a Database.SetInitializer con una instancia de IDatabaseInitializer. Por ejemplo, la estrategia RecreateDatabaseIfModelChanges eliminará automáticamente y volverá a crear la base de datos y, opcionalmente, la inicializará con nuevos datos.

No tengo claro por qué sucede esto o qué puedo cambiar. Simplemente creé el POCO, definí un DbContext simple, hice algunos ajustes y luego intenté ejecutar una consulta simple. Dado que estoy usando “Sólo código”, no conozco ninguna configuración que deba realizarse. Y ciertamente no quiero volver a crear o eliminar la base de datos ya que es una base de datos existente.

Gracias por cualquier idea

Encontré la respuesta en los comentarios de esta publicación en el blog de Scott Guthrie.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

Para aquellos que están viendo esta excepción:

“El modelo que respalda el contexto de ‘Producción’ ha cambiado desde que se creó la base de datos. Elimine / actualice manualmente la base de datos o llame a Database.SetInitializer con una instancia de IDatabaseInitializer.”

Esto es lo que está pasando y qué hacer al respecto:

Cuando se crea un modelo por primera vez, ejecutamos 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). Las bases de datos existentes no tendrán la tabla EdmMetadata y, por lo tanto, no tendrán el hash … y la implementación de hoy arrojará si falta esa tabla. Trabajaremos en cambiar este comportamiento antes de enviar la versión fial ya que es la predeterminada. Hasta entonces, las bases de datos existentes generalmente no necesitan ningún inicializador de base de datos, por lo que pueden desactivarse para su tipo de contexto llamando al:

Database.SetInitializer(null); 

Este es un error en CTP4 para usar EF con bases de datos preexistentes.

Puede solucionarlo llamando:

 Database.SetInitializer(null); 

en el método Application_Start de Global.asax

Comenté anteriormente y funcionó en el momento en que jugaba con EF5 para familarizarme con su funcionamiento. Ahora estoy escribiendo código “actual” y me he alejado de configurar un inicializador de base de datos por contexto en el código debido a una architecture que he decidido usar MEF para instanciar cualquier DbContext e inyectar todas las dependencias de configuración como partes componibles.

Así que de nuevo me encontré de inmediato con el error descrito anteriormente, pero esta vez elijo resolverlo usando las entradas del archivo de configuración como se muestra a continuación.

           

Entonces al establecer disableDatabaseInitialization = “true” en la sección del archivo de configuración para entityFramework puede superar el error descrito anteriormente y dado que no está en el código uno de los beneficios es la capacidad de “usar más fácilmente” constructores / fábricas abstraídos para crear contexto.

Todo lo que tuve que hacer fue soltar la tabla __MigrationHistory .

Contexto:

Recibí este error cuando cambié el nombre de una tabla. Después de que agregué la anotación [Table("NewTableName")] a uno de mis modelos, Entity Framework generó una __MigrationHistory table.

Tuve el mismo problema: volver a agregar la migración y actualizar la base de datos no funcionaba y ninguna de las respuestas anteriores parecía correcta. Entonces la inspiración me golpea: estoy usando varios niveles (un web, un dato y un negocio). La capa web nunca lanzó esta excepción: era la capa empresarial (que configuré como aplicación de consola para pruebas y depuración). Resulta que la capa de negocios no estaba usando la cadena de conexión correcta para obtener el DB y establecer el contexto. Así que agregué la cadena de conexión a la configuración de la aplicación y viola funciona. Poniendo esto aquí para otros que puedan enfrentar el mismo problema.