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

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

我该怎么做?

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

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

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

【问题讨论】:

标签: c# sql entity-framework entity-framework-6


【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 2017-09-01
      相关资源
      最近更新 更多