Entity Framework 6 Code First 触发器

31

我正在使用Entity Framework 6 Code First,想要创建一个触发器。

我应该如何做?

我需要触发器的原因是因为用户可能直接编辑数据库或通过我编写的程序进行编辑。我需要确保表中的2个列不会同时为空,也不会同时非空。

我一直在寻找方法,但找不到。

有没有办法使用Code First指定触发器?


可以考虑将其添加到类库中,例如EntityFrameworkExtras - JoeBrockhaus
3个回答

29

Entity Framework不支持触发器,尽管您可以手动执行创建触发器的语句,但是如果使用迁移,则需要在表创建后执行此操作。

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

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


谢谢你的回答!通常我会使用约束,但是(我没有提到)我计划也使用MySQL,而据我所知,MySQL不支持约束。 - Charles W
[Required] 属性是否满足非空约束? - Gusdor
1
@Gusdor - 问题在于他需要确保两个列不同时为空,同时又允许其中一个为空。 [Required] 属性不能做到这一点。 - Erik Funkenbusch
@ErikFunkenbusch 已经明白。 - Gusdor

13

11
如果你仔细阅读问题,就会发现他希望在数据库上设置触发器,因为可以直接修改数据库。你的“触发器”实际上并不是真正的触发器,只是由DbContext当前跟踪的实体引发的事件。考虑到DbContext的生命周期应该很短,我真的看不出有什么意义。 - kjbartel
1
一个不错的库,但不完全是我想要的。如果我在两个不同的应用程序之间打开两个上下文,并触发事件,它们不会共享。 - wonea
@wonea,该功能是下一个要实现的。我正在考虑添加对消息队列的支持,以便在实例、应用程序甚至机器之间传递触发事件。 - Nick Strupat

7

添加迁移之后,打开迁移文件并根据下面所示创建触发器:

注意:您需要运行update-database才能在数据库中看到更改。

在此输入图片描述


我认为在Entity Framework 7中现在是migrationBuilder.Sql。 - Max Aigner

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