14

Tradicionalmente siempre he escrito mis scripts sql a mano para que sean agradables y limpios (no soy fanático de los generados) y lanzamiento a lanzamiento, proporciono un script de instalación nuevo y un script de migración de la versión anterior que crea nuevas tablas, altera las tablas existentes, etc. Todo esto es bastante estándar.¿Cómo cambia el esquema del primer código EF 4 en un entorno de producción?

Realmente no he tenido mucho tiempo para jugar con el código EF 4, pero estoy bastante interesado en usarlo si es realmente viable en un entorno de producción.

Digamos que tiene un primer acercamiento de código donde una base de datos se creará automáticamente si no existe. ¿Qué sucede si publica una nueva versión del software que tiene cambios de esquema/modelo? ¿EF es lo suficientemente inteligente como para actualizar el esquema de la base de datos para que coincida con el modelo EF actualizado?

Escenario

  1. cliente instala asp.net MVC página web en su servidor. Al ejecutarse por primera vez, se crea una base de datos fresca
  2. cliente utiliza el sitio web por un tiempo y la base de datos se rellena con algunos datos
  3. Mientras tanto, una nueva versión de la página web se libera y el modelo de EF ha cambiado
  4. descargas nuevo Cliente versión, despliega sitio web y puntos de base de datos existente

es el código primero sólo es útil para la implementación inicial, o es lo suficientemente inteligente como para actualizar una base de datos existente de liberación para liberar de esta manera?

Respuesta

6

A partir de EF CTP4, su base de datos se eliminará y recreará cada vez que cambie su modelo de objeto (esta no es la convención predeterminada y debe indicar explícitamente a EF Code-First estableciendo una Estrategia de inicializador de base de datos)

Dicho esto, el equipo de EF están trabajando activamente en una Database Evolution (aka Migrations) Solution que aborda exactamente su escenario: Una solución que va a evolucionar el esquema de base de datos como los cambios de modelo de objetos en el tiempo que esencialmente trata de alterar la base de datos para estar de vuelta en sincronízate con tu modelo en lugar de recrearlo.

Como por equipo EF, esta función estará disponible como parte de EF próxima versión que está en camino de ser lanzado en el 1er trimestre de 2011.

+0

es bueno saberlo, aunque hasta que esa característica no sea conocida no creo que esta sea una ruta que pueda defender en la oficina. –

+0

Sí, no estaba seguro de si el marco de EF 4 era lo suficientemente maduro como para manejar esto. Gracias por el enlace. Voy a retrasar esta función, creo y supervisar el equipo de EF a principios de 2011 para las actualizaciones. ¡Aclamaciones! –

+1

@confusedGeek: Incluso después del lanzamiento de esta función, estoy seguro de que ninguna empresa le daría su base de datos de producción a EF para arreglarlo sobre la marcha. El script alternativo siempre debe pasar por los DBA, ya sea que lo haya escrito usted o el EF. –

2

La capacidad de crear una base de datos es sólo característica de un de Code First - y es una característica opcional. No tiene que usar esta característica en absoluto. De hecho, Scott Gu tiene una publicación de blog completa dedicada a usar Code First with an existing database.

Hasta que se liberen las migraciones de la base de datos, tiene que idear otra estrategia y esa estrategia simplemente será la gestión de sus scripts ALTER TABLE como lo haría tradicionalmente. Entonces, cuando implementa una nueva versión, ejecuta su script ALTER e implementa el código que contiene los cambios en el modelo.

Habiendo dicho todo eso, obtienes más opciones en Code First que simplemente descartar y volver a crear tu base de datos todo el tiempo (esa es solo una opción). También puede configurar el inicializador para que solo recree la base de datos si el modelo cambia. También puede configurar el inicializador para que nunca se ejecute en absoluto (en el caso de que administre manualmente cambios en la base de datos).This post le dará más información sobre los inicializadores de base de datos EF.

0

Estoy trabajando en el inicializador de contexto de base de datos que notificará al webmaster si el modelo y el esquema db no están sincronizados. Esto puede ser útil para desarrolladores que prefieren tener un control completo sobre el modelo de primer código y el esquema de la base de datos. Compruébelo usted mismo:

https://github.com/rialib/efextensions

0

Meses han pasado y ahora la respuesta oficial ha sido liberado: IDatabaseInitializer.

Aquí es más o menos lo que está buscando:

public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext> 
    where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) 
    { 
    } 
} 

Tomado de aquí: http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

Ahora usted puede transformar su esquema de la forma en que está acostumbrado. Por supuesto, también puede escribir un DatabaseInitializer más complejo que use C# en lugar de SQL, y hace cosas más complejas como verificar si es necesaria una modificación antes de realizarla, transformar datos a medida que cambia tablas, etc.

Otro pregunta StackOverflow que se ocupa de algunos de los detalles de las tablas de modificación: Entity Framework Code First fluent API setting field properties in a for loop

0

Uso de EF 6, u puede rediseñar su base de datos (código primero) asegurarse de que se han instalado todas las actualizaciones, a veces u puede tener diferentes esquemas en su base de datos existente para usarlos en su clase de contexto

modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge"); 

si no solo EF selecciona dbo.yourtable y no tablas como FullDepot.secondtable etc.

Cuestiones relacionadas