我首先使用Entity Framework Migrations来控制我的数据库模型。它很迷人,我现在可以处理所有事情。但是现在我需要添加一个数据库触发器,我想用EF迁移来做这个,而不是只为这种情况使用单独的sql脚本(这会让客户感到困惑,特别是在我们说服他们我们可以处理所有事情之后EF迁移)。 我的触发器是直接的,看起来像是:
CREATE OR REPLACE TRIGGER [name] BEFORE UPDATE ON myTable ...
是否有向EF迁移添加触发器的命令?
答案 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();");
}
}
也许对某人会有帮助。