¿Cómo puedo deshabilitar las primeras migraciones de código?


85

Tengo un modelo de entidad de código primero en EF5. Pero quiero administrar los cambios de la base de datos manualmente, no quiero que EF modifique mi base de datos existente y todos sus datos. Pero cuando hago cambios paralelos en el mapeo de EF y en la base de datos, EF se niega a operar correctamente y me dice que necesito usar la migración de código primero. ¿Cómo apago esto?


Respuestas:


100

establezca Database.SetInitializer en nulo.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
Establecer el inicializador en el constructor de instancias del contexto no tiene sentido. EF llamará al inicializador antes de llegar a ese código si intenta crear un nuevo contexto.
Jcl

1
Simplemente verifiqué la respuesta mirando "Herramienta de diagnóstico" en VS 2017. Las llamadas de ADO.NET antes de la primera consulta SQL deseada se detuvieron después de configurar el inicializador en nulo en el constructor.
Karl

2
Funciona como se esperaba. Es cierto que EF llamará al inicializador antes, pero luego volver a llamarlo dentro del constructor hace que DbContext simplemente ignore las migraciones, en caso de que quiera ignorar el hecho de que __MigrationHistoryno tiene la última migración y no quiere hazlo de todos modos. En mi caso, utilizo migraciones en un entorno de desarrollo, pero cuando implemento en producción, uso SSDT para actualizar la base de datos. Por lo tanto, EF se quejaría de que el modelo ha cambiado porque __MigrationHistoryno tendría la última migración, pero puedo garantizar que la base de datos esté actualizada.
Alisson

Sugeriría mover la llamada Database.SetInitializerdel constructor al constructor de la clase. Eso garantiza que la llamada solo se realice una vez.
Steven

40

Entonces, la respuesta más completa que he encontrado es esta:

  1. Elimina la Migrationscarpeta dentro de tu proyecto.
  2. Establecer Database.SetInitializer<DatabaseContext>(null);dentro de su inicializador de DatabaseContext.
  3. Elimina la tabla __MigrationHistorydentro de tu base de datos. Para EF6 +, la tabla se encuentra debajo, Tablespero para versiones anteriores se encuentra debajo System Tables.
  4. Construye y ejecuta.
  5. Lucro.

Desafortunadamente, después de seguir estos pasos, EF6 aún verifica la existencia de __MigrationHistorycada vez que se inicia mi aplicación, lo que agrega algunos milisegundos más al tiempo de inicio de mi aplicación. ¿Hay alguna forma de desactivar la __MigrationHistoryverificación por completo?
Dai

27

Si desea desactivar completamente las migraciones:

https://stackoverflow.com/a/9709407/141172

Sin embargo, me pareció mejor mantener habilitadas las primeras migraciones de código, pero use la -Scriptopción para que EF cree un script de cambio de base de datos para mí que pueda aplicar a cada base de datos (desarrollo, control de calidad, producción) manualmente:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

De esa manera, EF creará el script de cambios por mí, y todavía tengo control total sobre los cambios que se aplican. Versiono los scripts de cambio como cualquier otro código fuente.


1
su enlace realmente no corresponde a completely turn off migrations. Para hacer eso: agregue Database.SetInitializer<YourContextType>(null)al inicio de su aplicación
Don Cheadle

¿Alguna idea de cómo lograr esto con EF Core?
Shimmy Weitzhandler

@Shimmy: EF Core nunca debería intentar modificar automáticamente su base de datos. Ver github.com/dotnet/efcore/issues/3152
Eric J.

26

Si ya usó Migraciones, cambiar solo el Inicializador no ayudará. Debe ir a Management Studio, abrir las tablas de su base de datos, ir a la System Tablescarpeta y eliminar la __MigrationHistorytabla que se encuentra allí (para EF6 y superior, se encuentra directamente debajo Tables). Esto deshabilitará las migraciones para siempre.


7
La tabla __MigrationHistory se encuentra directamente debajo de Tablas, no en Tablas del sistema.
Peter Hedberg

6
@PeterHedberg Esto es cierto para EF6 +. Para versiones anteriores estaba debajo System Tables.
Episodex

1
También puede cambiar el nombre de la tabla, en lugar de eliminarla, utilizando sp_rename. También desactivé el inicializador.
NMrt

2

Acabo de resolver este "problema" por

  1. Eliminando la tabla "_MigrationHistory" de la base de datos.
  2. Eliminando la carpeta "Migraciones" del proyecto.
  3. Actualizando archivo EDMX.
  4. Limpiar el proyecto y reconstruirlo.

La configuración de mi entorno está siguiendo

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

¿Puedo preguntar qué actualizó en el archivo EDMX? También estoy usando Database First y todavía está consultando las tablas de migración que no existen ... ¡Gracias!
dalcam

¿Qué pasa si más adelante necesitamos migraciones, crea una nueva _MigrationHistorytabla automáticamente?
sairfan
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.