使用ADO.NET实体框架拦截实体保存

3

我希望在对象存储到ObjectContext#SaveChanges()之前,在实体对象内部调用验证函数。现在,我可以自己跟踪所有已更改的对象,然后循环遍历它们并调用它们的验证方法,但我认为更简单的方法是实现一些回调函数,ObjectContext将在保存每个实体之前调用它们。这是否可以完成?是否有其他替代方案?

2个回答

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,个人而言,我喜欢将其抽象化,以使客户更易于测试。

我所做的是使用存储库模式,并在存储库上调用保存时进行验证。


谢谢 - 这是个好建议。但我倾向于先从简单开始,只有在必要时才添加更多的抽象层。话虽如此,客户端测试确实可以在没有模拟的情况下深入EF和DB - 不完全是单元测试,但到目前为止效果很好。 - Buu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接