实体框架 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 添加新条目时出现重复条目