实体框架 6 代码优先触发器

Posted

技术标签:

【中文标题】实体框架 6 代码优先触发器【英文标题】:Entity Framework 6 Code First Trigger 【发布时间】:2014-03-23 11:48:29 【问题描述】:

我正在使用 Entity Framework 6 Code First,并希望创建一个触发器。

我该怎么做?

我需要触发器的原因是因为用户可以直接编辑数据库,也可以通过我正在编写的程序编辑数据库,并且我需要确保表中的 2 列不都是空的,也不都是空的.

我一直在寻找,但找不到路。

有没有办法先用代码指定触发器?

【问题讨论】:

添加到像 EntityFrameworkExtras 这样的库中可能很有用。 【参考方案1】:

实体框架不支持触发器,虽然您当然可以手动执行将创建触发器的语句,但您需要在创建表后执行此操作(如果使用迁移)。

您可以使用 Ladislav 在EF 4.1 code-first adding a trigger to a table 中指定的技术

请注意他的警告,但是,EF 不会知道触发器中所做的任何更改。如果您的意图只是确保表中的 2 列不为空,则最好使用约束(EF 也不支持约束,但您可以手动添加它们)。

【讨论】:

感谢您的回答!通常我会使用约束,但是,(我没有提到)我也打算使用 mysql,据我所知 MySQL 不支持约束。 [Required] 属性是否满足非空约束? @Gusdor - 问题是他需要确保两列不同时为空,同时允许任一列为空。 [Required] 属性不会这样做。 @ErikFunkenbusch 明白了。【参考方案2】:

查看我的图书馆EntityFramework.Triggers。它在实体框架层工作,因此如果有人直接修改数据库,则不会触发触发器事件。 NuGet 链接是https://www.nuget.org/packages/EntityFramework.Triggers/

【讨论】:

如果你读过这个问题,你会看到他想要一个数据库触发器,因为数据库可以直接修改。您的triggers 根本不是真正的触发器,只是当前由 DbContext 跟踪的实体上的事件。考虑到 DbContext 的寿命应该很短,我真的不明白这一点。 一个不错的库,但不是我想要的。如果我在两个不同的应用程序之间打开两个上下文,并触发它们不共享的事件。 @wonea 功能是列表中的下一个。我正在考虑添加对消息队列的支持,以便在实例、应用程序甚至机器之间传递触发事件。【参考方案3】:

添加迁移后,打开迁移文件并创建触发器,如下所示

注意:您需要运行 update-database 以查看数据库中的更改。

【讨论】:

【参考方案4】:

也许我的library 对某人有用,尽管它仅适用于最新版本的 EfCore。它扩展了 ModelBuilder 语法,将其转换为 SQL,并通过 migrationBuilder.Sql() 应用接收到的代码。

modelBuilder.Entity<Transaction>()
    .AfterUpdate(trigger => trigger
        .Action(action => action
            .Condition((transactionBeforeUpdate, transactionAfterUpdate) => transactionBeforeUpdate.IsVeryfied && transactionAfterUpdate.IsVeryfied) // Executes only if condition met 
            .Update<UserBalance>(
                (transactionBeforeUpdate, transactionAfterUpdate, userBalances) => userBalances.UserId == oldTransaction.UserId, // Will be updated entities with matched condition
                (oldTransaction, updatedTransaction, oldBalance) => new UserBalance  Balance = oldBalance.Balance + updatedTransaction.Value - oldTransaction.Value ))); // New values for matched entities.

【讨论】:

以上是关于实体框架 6 代码优先触发器的主要内容,如果未能解决你的问题,请参考以下文章

使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目

使用AFTER INSERT触发器将实体框架插入表中

使用带有 MVC4 SQL Server 的实体框架插入后触发器不会触发

实体框架6.2代码优先错误

实体框架 6 代码优先到 RDS 尝试创建数据库

EF 6.X 中的实体框架代码优先 Fluent API 默认值