Saltar al contenido

Agregar disparador de base de datos con Entity Framework Code First Migrations

Te damos la bienvenida a nuestro sitio web, en este lugar encontrarás la respuesta a lo que estabas buscando.

Solución:

Solo puedes agregar un Sql("SQL COMMAND HERE") llamada de método a su migración Up método. No olvide agregar también la instrucción drop al Down método. Puede crear una migración vacía si lo necesita, simplemente ejecutando Add-Migration sin cambios en el modelo.

public partial class Example : DbMigration

    public override void Up()
    
        Sql("CREATE OR REPLACE TRIGGER [name] BEFORE UPDATE ON myTable ...");
    

    public override void Down()
    
        Sql("DROP TRIGGER [name]");
    

Recientemente me enfrenté a un problema similar y no encontré una solución para no escribir sql manualmente. Así que escribí un pequeño paquete que permite escribir migraciones usando el generador de entidades Ef Core como este:

modelBuilder.Entity()
    .AfterInsert(trigger => trigger
        .Action(triggerAction => triggerAction
            .Upsert(transaction => new  transaction.UserId ,
                insertedTransaction => new UserBalance  UserId = transaction.UserId, Balance = insertedTransaction.Sum ,
                (insertedTransaction, oldBalance) => new UserBalance  Balance = oldBalance.Balance + insertedTransaction.Sum )));

Este código se traducirá a sql y se aplicará a las migraciones.

public partial class AddTriggers : Migration

    protected override void Up(MigrationBuilder migrationBuilder)
    
        migrationBuilder.Sql("CREATE FUNCTION LC_TRIGGER_AFTER_INSERT_TRANSACTION() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_TRANSACTION$ BEGIN INSERT INTO user_balances (user_id, balance) VALUES (NEW.user_id, NEW.sum) ON CONFLICT (user_id) DO UPDATE SET balance = user_balances.balance + NEW.sum; RETURN NEW;END;$LC_TRIGGER_AFTER_INSERT_TRANSACTION$ LANGUAGE plpgsql;CREATE TRIGGER LC_TRIGGER_AFTER_INSERT_TRANSACTION AFTER INSERT ON transactions FOR EACH ROW EXECUTE PROCEDURE LC_TRIGGER_AFTER_INSERT_TRANSACTION();");
    

    protected override void Down(MigrationBuilder migrationBuilder)
    
        migrationBuilder.Sql("DROP TRIGGER LC_TRIGGER_AFTER_INSERT_TRANSACTION ON transactions;DROP FUNCTION LC_TRIGGER_AFTER_INSERT_TRANSACTION();");
    

Tal vez sea útil para alguien.

Si estás de acuerdo, tienes la habilidad dejar un tutorial acerca de qué te ha impresionado de este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

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