Migración de código primero: ¿Cómo establecer el valor predeterminado para una nueva propiedad?


Estoy usando EF6 para almacenar instancias de la clase report en mi base de datos. La base de datos ya contiene datos. Digamos que quería añadir una propiedad a report,

public class report {
    // ... some previous properties

    // ... new property:
    public string newProperty{ get; set; }
}

Ahora si voy a la consola del gestor de paquetes y ejecuto

add-migration Report-added-newProperty
update-database

Obtendré un archivo en la carpeta '/Migrations' agregando una columna newProperty a la tabla. Esto funciona bien. Sin embargo, en las entradas más antiguas de la base de datos, el valor de newProperty ahora es una cadena vacía. Pero quiero que sea, por ejemplo, "viejo".

Así que mi la pregunta es: ¿Cómo puedo establecer valores predeterminados para nuevas propiedades (de cualquier tipo) en el script de migración (o en otro lugar)?

Author: Noctis, 2015-06-24

4 answers

Si ves el código de migración generado verás AddColumn

AddColumn("dbo.report", "newProperty", c => c.String(nullable: false));

Puedes añadir defaultValue

AddColumn("dbo.report", "newProperty", 
           c => c.String(nullable: false, defaultValue: "old"));

O añadir defaultValueSql

AddColumn("dbo.report", "newProperty",
           c => c.String(nullable: false, defaultValueSql: "GETDATE()"));
 41
Author: Hamid Pourjam,
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-07-24 14:13:21

Tiene que cambiar la línea en su script de migración que agrega la propiedad / columna de esta manera:

AddColumn("dbo.reports", "newProperty", c => c.String(nullable: false, defaultValue: "test"));
 5
Author: ngu,
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-06-24 12:04:45

Espero que ayude a alguien. Poniendo todo junto de respuestas anteriores (ejemplo usando una propiedad booleana):

1) Añadir una nueva propiedad a la entidad.

/// <summary>
/// Determines if user is enabled or not. Default value is true
/// </summary>
public bool IsEnabled { get; set; }

2) Ejecute el siguiente comando para agregar el nuevo cambio en las migraciones.

add-migration addIsEnabledColumn

3) Se crea un archivo de migración a partir del comando anterior, abra ese archivo.

introduzca la descripción de la imagen aquí

4) Establezca el valor predeterminado.

public override void Up()
    {
        AddColumn("dbo.AspNetUsers", "IsEnabled", c => c.Boolean(nullable: false, defaultValue: true));
    }
 1
Author: Victor LG,
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-06-21 18:38:47

Descubrí que solo usar el Inicializador de Propiedades automáticas en la propiedad de entidad es suficiente para hacer el trabajo.

Por ejemplo:

public class Thing {
    public bool IsBigThing { get; set; } = false;
}
 -5
Author: Velyo,
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-04-10 09:58:47