2011-03-21 16 views
14

utilizo el siguiente código en mi Global.asax:EF CodeFirst: DropCreateDatabaseIfModelChanges no funciona

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

pero no parece funcionar.

Aunque mi modelo ha cambiado y estoy tratando de usar una de las tablas recién agregadas, simplemente dice que no se pudo encontrar la tabla.

Invalid object name 'dbo.TableName'. 

Si funciono esto, sin embargo, parece que funciona, y se está creando la tabla:

DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>()); 

No actualizar mi base de datos.

¿Qué es lo que hago mal?

+0

¿Modificó las convenciones? –

+0

No me refiero a IncludeMetadataConvention. ¿Lo eliminaste? ¿Tienes tabla EdmMetadata en tu db? –

+0

Por cierto. ¿Qué quiere decir con "modelo" y "mesa"? –

Respuesta

8

Resultó ser permisos de usuario en la base de datos maestra. Es extraño que el uso de DropCreateDatabaseAlways no necesite permisos en la base de datos maestra, donde IfModelChanges sí lo hace.

+0

¿Pero no necesita buscar en la base de datos master para verificar tu modelo de base de datos? Donde como siempre se caiga, no es necesario echar un vistazo en la base de datos maestra. La base de datos principal solía contener los objetos del sistema, pero está en una versión más nueva en la base de datos de recursos (vea http://technet.microsoft.com/en-us/library/ms190940.aspx sobre la base de datos de recursos y http://technet.microsoft). .com/en-us/library/ms187837.aspx sobre la base de datos master) –

1

Se espera que este comportamiento en caso de que haya extraído IncludeMetadataConvention: modelBuilder.Conventions.Remove<System.Data.Entity.Database.IncludeMetadataConvention>();

+0

en ese caso, pero no es el caso. – reinder

10

Por lo que vale la pena, me encontré con un montón de problemas con tanto de las estrategias DropCreate porque Cassini seguía en marcha después de que cerraba el navegador . (Tuve el mismo problema con IIS Express.) Debido a que el servidor web local aún se estaba ejecutando, Application_Start no volvió a iniciarse, por lo que la inicialización que puse allí nunca se ejecutó.

lo resolví al permitir Editar y continuar:

Propiedades del proyecto>Web>depuradores>Activar Editar y continuar

Esto obliga al servidor web local para cerrar cuando el navegador se cierra

+1

Estoy usando esto en una aplicación MVC3 con cassini. Me parece que si reconstruyo mi solución después de modificar mis clases de modelo y antes de volver a ejecutarla, el drop/create hace su trabajo. –

+0

si está presionando depurar o ejecutar sin depurar esto es normalmente la acción predeterminada en el estudio visual, la única razón por la que puedo ver que esto sucede es si modifica el código y luego vuelve a navegar al sitio sin reconstruir –

4

tuve el mismo problema con:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>()); 

En mi caso, la base de datos ya existía cuando he añadido la línea de código anterior. Solté el db y ejecuté mi programa nuevamente y comenzó a funcionar como se esperaba. Solo otro conflicto podría haber sido la causa es que había estado jugando con 'Habilitar migraciones' en la base de datos.

HTH

Cuestiones relacionadas