gpt4 book ai didi

c# - 使用动态数据进行自定义高级实体验证

转载 作者:可可西里 更新时间:2023-11-01 08:26:43 26 4
gpt4 key购买 nike

我正在寻找一种解决方案,以在用户使用 Entity Framework 在动态数据屏幕中保存其更改时执行一些自定义实体验证(这需要数据库访问、跨成员验证...)。
验证比我可以用属性做的更复杂(它需要访问数据库等)

你能拦截 SaveChanges 调用吗?
我试图覆盖 DbContext 对象中的 ValidateEntity,但动态数据似乎没有调用它(可能是因为它使用的是内部 ObjectContext,不确定原因),覆盖 SaveChanges 也无济于事。
我没有看到任何可以订阅的事件...

documentation应该有帮助:

Customize validation for an individual data field by overriding the OnValidate method or handling the Validate event, which are invoked when any data field is changed. This approach lets you add validation and business logic for an individual field. This approach is more general than adding validation for an individual field. It is useful when the same validation logic can be applied to more than one data field. It also lets you perform validation checks that involve multiple fields.

但我使用的是 POCO Entity Framework 6 类,因此没有要覆盖的 OnValidate 方法,从我读到的内容来看,这是针对 LinqToSql 的,我找不到 Validate 他们提到的事件。

我试图在我的 DbContext 的构造函数中订阅内部 ObjectContextSavingChanges 事件,以手动调用 ValidateEntity,但是我不知道如何处理结果。如果我抛出 DbEntityValidationException(或 ValidationException,如 this article 中建议的那样),ASPNET 会像处理任何异常一样处理它(黄色屏幕)。

实现 IValidatableObject 也不起作用。

我还尝试实现自己的 DynamicValidator 以查看会发生什么,但没有成功,它似乎可以处理异常(如果我覆盖 ValidateException,并放置一个断点,我看到了)但它仍然冒泡到默认错误处理程序并显示黄色屏幕。我一定是遗漏了什么。

那么,在保存到动态数据/EF 之前,您应该如何对实体执行复杂的验证(跨字段、查询等)?

最佳答案

我认为您尝试执行的逻辑不属于您架构中的此类级别。让数据库强制执行它应该执行的约束,例如外键等,并将您的业务逻辑放在上面的一层。例如,在您想要验证的实体上,您可以添加一个 IsValidForAddOrUpdate() 方法,该方法包含您无论如何都会放入验证器中的逻辑。然后使用新方法:

if (entity.IsValidForAddOrUpdate())
{
db.Set<Entity>().Add(entity);
db.SaveChanges()
}
else throw new DbValidationException("Entity failed validation due to rule xyz.");

关于c# - 使用动态数据进行自定义高级实体验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com