2009-01-16 96 views
3

我想在ObjectContext#SaveChanges()存储之前调用实体对象内的验证函数。现在,我可以自己跟踪所有更改的对象,然后循环遍历所有对象并调用它们的验证方法,但是我认为更简单的方法是实现ObjectContext在保存每个实体之前调用的一些回调。后者可以完成吗?有其他选择吗?使用ADO.NET实体框架拦截实体保存

回答

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时进行验证。

+0

谢谢 - 这是一个很好的。但是我倾向于先从简单开始,只在必要时才添加更多抽象层。也就是说,客户端测试确实在没有任何模拟的情况下通过EF和DB进行挖掘 - 不是非常单元测试,但目前为止效果很好。 – 2009-01-17 05:35:41