Cambiar datos en la migración Subir método-Entity Framework


He añadido una nueva propiedad a mi modelo existente. Es una propiedad bool con el valor predeterminado true. Hay datos existentes en esta tabla y me gustaría establecer la nueva propiedad de una fila específica en false justo después de crear el nuevo campo, en el método Up.

public override void Up()
    {
        AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false));
        using (Context ctx = new Context())
        {
            var validation = ctx.RequestValidationErrorSet.FirstOrDefault(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound");
            if (validation != null)
            {
                validation.IsBreaking = false;
                ctx.SaveChanges();
            }
        }
    }

De esta manera EF lanza un error al decir

Sistema.InvalidOperationException: El modelo que respalda el El contexto' DbContext ' ha cambiado desde que se creó la base de datos. Considere usar el Código Primero Migraciones para actualizar la base de datos

¿Es posible cambiar la base de datos aquí o debería hacerlo en otro lugar?

Author: Perrier, 2015-11-04

4 answers

En medio de una migración, es mejor usar el método Sql() para actualizar los datos de la base de datos.

Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = 'RequestValidationError.MoreThanOneItemFound'");

También debe definir el valor predeterminado para la nueva columna. Así que la solución debería ser algo como esto:

public override void Up()
{
    AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false, default: true));
    Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = \"RequestValidationError.MoreThanOneItemFound\"");
}

Usar un DbContext en medio de su migración es muy ambiguo. ¿Qué esperas del contexto? Tiene el después del estado de migración en sus modelos, pero la base de datos tiene el antes del estado de migración en las tablas. Así que el modelo y la base de datos no coincide. Si aún insiste en usar DbContext en su código, deshabilitar la comprobación del modelo podría ser la solución. Puede desactivar la comprobación del modelo usando:

Database.SetInitializer<Log4ProContext>(null);
 31
Author: mehrandvd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-04 08:36:37

Si desea utilizar el framework para cambios como este, debe separar los cambios en la base de datos de los cambios en los datos.

Cree una migración solo para los cambios de la base de datos y ejecútela.

Luego crea una nueva migración (los métodos Up() y Down() estarán vacíos). Ahora puede crear una instancia de su DatabaseContext y no habrá ningún error. De esta manera puede usar el Framework para estos cambios, e implementar correctamente un método Down ().

 11
Author: user868386,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-17 18:06:00

Escribir DataMigrations para EF6 puede ser una tarea. Armamos una biblioteca que solo estoy open sourcing aquí para que otros la usen, que agrega esta característica largamente prometida y faltante a EF6. Simplemente escriba clases usando consultas EF regulares, etc.

Https://github.com/b9chris/Brass9.Data

 2
Author: Chris Moschini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-20 18:08:43

En lugar de usar el método Sql también podría usar el UpdateData método.

migrationBuilder.UpdateData(
    table: "RequestValidationErrors", 
    keyColumn: "WordCode", 
    keyValue: "RequestValidationError.MoreThanOneItemFound", 
    column: "IsBreaking", 
    value: false);

(No se si solo ef core soporta este método)

 1
Author: NtFreX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 14:18:16