【发布时间】:2016-08-22 21:56:15
【问题描述】:
我正在寻找一种解决方案,以在用户使用 Entity Framework 将其更改保存在动态数据屏幕中时执行一些自定义实体验证(这将需要数据库访问、跨成员验证...)。
验证比我可以对属性执行的操作更复杂(它需要访问数据库等)
你能拦截 SaveChanges 调用吗?
我试图覆盖 DbContext 对象中的ValidateEntity,但动态数据似乎没有调用它(可能是因为它使用的是内部 ObjectContext,不知道为什么),并且覆盖 SaveChanges 也无济于事。
我没有看到任何可以订阅的活动...
documentation 应该会有所帮助:
通过覆盖 OnValidate 方法或处理被调用的 Validate 事件 当任何数据字段更改时。这种方法允许您添加验证 和单个字段的业务逻辑。这种做法更 一般而不是为单个字段添加验证。它是有益的 当相同的验证逻辑可以应用于多个数据时 场地。它还允许您执行验证检查,包括 多个字段。
但是我使用的是 POCO Entity Framework 6 类,所以没有 OnValidate 方法可以覆盖,从我读到的内容来看,这是针对 LinqToSql,我找不到他们提到的 Validate 事件。
我尝试在我的 DbContext 的构造函数中订阅内部ObjectContext 的SavingChanges 事件,以手动调用ValidateEntity,但我不知道如何处理结果。如果我抛出一个DbEntityValidationException(或ValidationException,就像this article 中建议的那样),ASPNET 会像处理任何异常(黄屏)一样处理它。
实现IValidatableObject 也不起作用。
我也尝试实现我自己的DynamicValidator 来看看会发生什么,但没有成功,它似乎处理了异常(如果我覆盖ValidateException,并放置一个断点,我看到了)但它仍然冒泡到默认错误处理程序并显示黄色屏幕。我一定是错过了什么。
那么,在保存到动态数据/EF 之前,您应该如何对实体执行复杂的验证(跨字段、查询等)?
【问题讨论】:
标签: c# entity-framework validation asp.net-dynamic-data