如何在EntityFrameworkCore.Triggered前置保存触发器中取消增改操作
解决EntityFrameworkCore.Triggered中取消插入/更新操作的方法
要在firstName.Length > 1 && lastName.Length > 1不满足时取消对应的插入或更新操作,你可以通过抛出验证异常的方式实现——EntityFrameworkCore.Triggered的触发器没有直接的Cancel API,抛出异常会终止当前保存流程,从而取消操作。
修改后的代码如下:
using System.ComponentModel.DataAnnotations; using EntityFrameworkCore.Triggered; namespace MMSP_Providers.Data.Triggers { public class EnsureInterlocutorNameUniformity : IBeforeSaveTrigger<Interlocutor> { public Task BeforeSave(ITriggerContext<Interlocutor> context, CancellationToken cancellationToken) { if (context.ChangeType == ChangeType.Added || context.ChangeType == ChangeType.Modified) { string firstName = context.Entity.FirstName, lastName = context.Entity.LastName; if (firstName.Length > 1 && lastName.Length > 1) { context.Entity.FirstName = char.ToUpper(firstName[0]) + firstName[1..]; context.Entity.LastName = lastName.ToUpper(); } else { // 抛出异常终止保存,取消插入/更新操作 throw new ValidationException("名和姓的长度必须都大于1"); } } return Task.CompletedTask; } } }
关键说明:
- 使用
ValidationException(来自System.ComponentModel.DataAnnotations命名空间)是符合EF Core验证逻辑的标准做法,你也可以自定义异常类型,但标准异常更便于上层统一处理。 - 异常抛出后,EF Core会自动回滚当前的保存操作,达到取消目标操作的效果。
- 若需更温和的错误处理,可结合
DbContext.ValidationErrors集合,但触发器场景下直接抛出异常是最直接有效的方式。
内容的提问来源于stack exchange,提问作者Sharry
相关产品推荐
相关产品推荐

