我正在寻找一种解决方案,以在用户在Entity Framework的动态数据屏幕中保存更改时执行一些自定义实体验证(需要数据库访问,跨成员验证等),
因为验证比使用属性要复杂得多(需要访问数据库等),所以无法用属性完成。
您能拦截SaveChanges调用吗?
我尝试在DbContext对象中覆盖ValidateEntity,但是Dynamic Data似乎没有调用它(可能是因为它使用内部ObjectContext,不确定原因),覆盖SaveChanges也没有帮助。
我看不到任何可以订阅的事件...
文档应该会有所帮助:
通过覆盖OnValidate方法或处理Validate事件来自定义单个数据字段的验证,当更改任何数据字段时都会调用这些方法。此方法允许您为单个字段添加验证和业务逻辑。此方法比为单个字段添加验证更通用。当可以将相同的验证逻辑应用于多个数据字段时,它非常有用。它还允许您执行涉及多个字段的验证检查。
但我正在使用POCO Entity Framework 6类,因此没有要覆盖的OnValidate方法,并且根据我所读的内容,这适用于LinqToSql,我找不到他们提到的Validate事件。
我尝试在DbContext的构造函数中订阅内部ObjectContext的SavingChanges事件,以手动调用ValidateEntity,但我不知道该怎么处理结果。如果我抛出DbEntityValidationException(或像这篇文章中建议的ValidationException),ASPNET会像处理任何异常一样处理它(黄屏)。
实现IValidatableObject
也无法解决问题。
我还尝试了实现自己的DynamicValidator
,但是没有成功,它似乎处理了异常(如果我重写ValidateException
并放置一个断点,我可以看到它),但它仍然被传递到默认的错误处理程序,并显示黄色屏幕。我一定漏掉了什么。
那么,在保存动态数据/ EF之前,如何执行复杂验证(跨字段,带查询等)?