使用Entity Framework Code First Migrations添加数据库触发器

时间:2014-02-12 15:17:22

标签: .net entity-framework ef-migrations

我首先使用Entity Framework Migrations来控制我的数据库模型。它很迷人,我现在可以处理所有事情。但是现在我需要添加一个数据库触发器,我想用EF迁移来做这个,而不是只为这种情况使用单独的sql脚本(这会让客户感到困惑,特别是在我们说服他们我们可以处理所有事情之后EF迁移)。 我的触发器是直接的,看起来像是:

CREATE OR REPLACE TRIGGER [name] BEFORE UPDATE ON myTable ...

是否有向EF迁移添加触发器的命令?

2 个答案:

答案 0 :(得分:31)

您只需向迁移的Up方法添加Sql("SQL COMMAND HERE")方法调用即可。不要忘记还将drop语句添加到Down方法。您可以根据需要创建空迁移,只需运行Add-Migration而无需对模型进行任何更改。

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]");
    }
}

答案 1 :(得分:0)

最近,我遇到了类似的问题,没有找到不手动编写sql的解决方案。因此,我写了一点package,它允许使用Ef Core实体构建器来编写迁移,如下所示:

modelBuilder.Entity<Transaction>()
    .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 })));

此代码将被翻译成sql并应用于迁移,看起来像

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();");
    }
}

也许对某人会有帮助。