我想在ObjectContext#SaveChanges()存储之前调用实体对象内的验证函数。现在,我可以自己跟踪所有更改的对象,然后循环遍历所有对象并调用它们的验证方法,但是我认为更简单的方法是实现ObjectContext在保存每个实体之前调用的一些回调。后者可以完成吗?有其他选择吗?使用ADO.NET实体框架拦截实体保存
3
A
回答
8
我已经想通了。基本上,我们可以拦截ObjectContext的SavingChanges事件,并通过新增/修改的实体循环来调用它们的验证功能。这是我使用的代码。
partial void OnContextCreated()
{
SavingChanges += PerformValidation;
}
void PerformValidation(object sender, System.EventArgs e)
{
var objStateEntries = ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified);
var violatedRules = new List<RuleViolation>();
foreach (ObjectStateEntry entry in objStateEntries)
{
var entity = entry.Entity as IRuleValidator;
if (entity != null)
violatedRules.AddRange(entity.Validate());
}
if (violatedRules.Count > 0)
throw new ValidationException(violatedRules);
}
0
嗯,你可以这样做,但这意味着你允许你的客户端直接访问ObjectContext,并且我个人喜欢将它抽象出来,以便让客户端更易于测试。
我所做的是使用存储库模式,并在存储库上调用save时进行验证。
相关问题
- 1. 使用实体框架保存实体
- 2. ADO.NET实体框架
- 3. 实体框架7拦截器
- 4. 实体框架 - 保存子实体
- 5. 实体框架VS Ado.net
- 6. dlinq与ADO.NET实体框架
- 7. 实体框架与ADO.NET
- 8. ADO.net实体框架的API
- 9. ADO.Net实体框架事务
- 10. ADO.NET实体框架夸克
- 11. 错误使用ADO.NET实体框架
- 12. 使用ado.net实体框架排序gridview
- 13. 使用与ADO.NET实体框架
- 14. ADO.NET - 在实体框架使用AsQueryable已()
- 15. 存储过程与ADO.NET实体框架
- 16. ADO.NET实体框架ObjectContext - 缓存问题
- 17. 如何在实体框架中使用拦截器时禁用拦截器
- 18. ADO.NET实体框架 - 甲骨文与实体框架6
- 19. 实体框架InvalidOperationException保存
- 20. 实体框架不保存
- 21. 使用ADO.NET实体框架创建的实体类?
- 22. 使用实体框架保存推文
- 23. 使用实体框架保存实体列表
- 24. 三层架构使用ADO.NET实体框架和简易ADO.NET类
- 25. ADO.NET实体框架SaveChanges()不起作用
- 26. ADO.NET实体框架SaveChanges不起作用
- 27. 使用ADO.NET实体框架强制使用存储过程
- 28. Databind ADO.NET实体框架到列表框
- 29. 实体框架保留幽灵实体?
- 30. 在ADO.NET实体框架中保存导航属性
谢谢 - 这是一个很好的。但是我倾向于先从简单开始,只在必要时才添加更多抽象层。也就是说,客户端测试确实在没有任何模拟的情况下通过EF和DB进行挖掘 - 不是非常单元测试,但目前为止效果很好。 – 2009-01-17 05:35:41