Solución:
La solución que encontré fue:
-
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; }
-
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; }
-
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. -
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))"); }
-
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)");
}
}