我正在使用EntityFramework BulkInsert extension将大型数据集插入数据库。但是,我要在其中插入数据的表上有一个AFTER INSERT
触发器,似乎没有触发。这是扩展的限制吗?有没有办法确保操作完成后触发触发器?
事实证明,我看起来不够努力。主要BulkInsert
方法有一些重载未在文档中的任何地方列出,我无法通过任何Google搜索找到它们,但是其中一个重载允许标记。标志之一是SqlBulkCopyOptions.FireTriggers
。
其用法类似于:context.BulkInsert(values, SqlBulkCopyOptions.FireTriggers)
。使用此方法,触发器将单独处理每一行,并且一切都会按预期进行。
编辑:答案评论
您能解释一下CheckConstraint的作用吗?
一个约束是当您添加一些检查时,例如该值必须在10
和50
之间才能有效并插入。
因此,如果不检查约束,即使超出范围,也将插入5
值而不会出现问题。如果检查约束,将引发错误:
The INSERT statement conflicted with the CHECK constraint "CHK_ColumnWithConstraint". The conflict occurred in database "db_2560", table "dbo.Customers", column 'ColumnWithConstraint'.
The statement has been terminated.
这里是一个在线示例:https://dotnetfiddle.net/AMgTYQ
这就是为什么我推荐SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints
如果该表具有触发器,则可能在何时触发它们。如果列具有约束,那么如果该值对于检查无效,则您可能希望操作抛出错误。