Saltar al contenido

¿Cómo hacer primero una columna calculada persistente en el código EF?

Solución:

La solución que encontré fue:

  1. Asegúrese de que las migraciones automáticas estén desactivadas. Esto es para que VS generará un script (código de API fluido) para que lo personalicemos aún más en lugar de simplemente ejecutarlo. Entonces en la clase de configuración:

    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
    
  2. Agregue el campo a la clase y configúrelo como calculado, el establecedor es privado porque obviamente no podemos escribir en un campo calculado:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string BreakdownNo { get; private set; }
    
  3. Entonces haz un add-migration [xyz-name] en la Consola del Administrador de paquetes para generar el código de migración, que aparecerá en la carpeta de migraciones con el nombre de pila.

  4. Dentro de la migración, comente el código en Up() y agregue SQL personalizado así:

    public override void Up()
    {
        //AddColumn("dbo.Calls", "BreakdownNo", c => c.String());
        Sql("ALTER TABLE dbo.Calls ADD BreakdownNo AS ('BD'+RIGHT('00000'+ CAST(Id AS VARCHAR), 6))");
    }
    
  5. Hacer un update-database en el PM y debe agregar la columna calculada correctamente.

NOTAS ADICIONALES : Si obtiene la fórmula incorrecta, tendrá que revertir la migración haciendo una update-database -targetMigration: [name of migration to go back to] entonces haz otro add-migration name y modifique su fórmula allí, terminando con update-database. Puede que haya una forma mejor, pero esto es lo que encontré y utilicé.

Sin embargo, no encontré una manera de hacer que el campo persistiera todavía.

¿Por qué no llamar a sql así?

public class demo
{
    void demoMethod()
    {
        Model1 model = new Model1();//Model1 : DbContext
        model.Database.ExecuteSqlCommand("alter table Results drop column Total; alter table Results add Total AS (Arabic + English + Math + Science)");
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *