使用Entity Framework Core能否创建触发器,如何创建?

16

使用Entity Framework Core创建SQL触发器是否可能?

也许可以通过使用以下指示:

protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
{
}

或者仅仅通过在迁移脚本中执行SQL语句

public override void Up()
{
}

触发器是高度特定于供应商的 - 因此,请添加一个标签来指定您正在使用的是 mysqlpostgresqlsql-serveroracledb2 - 或者完全不同的其他内容。 - marc_s
啊,好的。触发器不是标准的吗? - Bastien Vandamme
理论上:是的 - 几乎每个严肃的关系型数据库管理系统都有触发器。但是,具体的语法和它们的功能因产品而异.... - marc_s
目前还没有流畅的API,因此选项(2)- migrationBuilder.Sql("CREATE TRIGGER …")等。 - Ivan Stoev
1
无法扩展流畅的API来创建填充Up()方法的操作,这是不可能的吗?我猜不行,因为我不知道如何让流畅的API与快照进行比较。我对EF的这个核心版本非常失望,因为我真的期望能够改进模型定义的方式,并在数据库上拥有更多的控制。 - Bastien Vandamme
2个回答

11
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"create trigger .....");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"drop trigger <triggerName>");
    }

1
这会在生成 SQL 时失败,因为它试图从存储过程内部创建触发器。 - Chazt3n
@Chazt3n,你能提供一下你尝试过的例子吗? - Tigran
谢谢你提醒我这个问题。除非在生成SQL时指定--idempotent,否则这不会失败。我不知道我们的CI管道已经更改了这个。 - Chazt3n

11

Laraue.EfCoreTriggers是一个用于创建SQL触发器的软件包,通过流畅的语法可以使得触发器在工作之后执行插入、更新、upsert、删除、如果不存在则插入等语句。

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 并使用迁移应用。

migrationBuilder.Sql()

感谢这个库,不幸的是,当我尝试编写以下代码时,dotnet ef migrations add AMigration 执行时 Up 方法中没有生成任何内容: .Action(ta => ta.Update( (insertedEntity, searchedEntity) => insertedEntity.Id == searchedEntity.Id, (insertedEntity, foundEntity) => (new AvailabilitySettings(foundEntity) { Revision = foundEntity.Id })) ));``` - Dragouf
在配置您的DbContext时,您是否使用过扩展方法.UseTriggers()? - Belyansky Ilya
是的,我做了。也许只是一个小事情要告诉你。我的 dbcontext 在一个单独的库中。我在类内部使用硬编码的连接字符串来进行迁移命令。 - Dragouf
你能提供能够重现问题的源代码仓库吗? - Belyansky Ilya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接