Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用ADO.NET实体框架截取实体保存_Entity Framework - Fatal编程技术网

Entity framework 使用ADO.NET实体框架截取实体保存

Entity framework 使用ADO.NET实体框架截取实体保存,entity-framework,Entity Framework,我想在使用ObjectContext#SaveChanges()存储实体对象之前调用实体对象内部的验证函数。现在,我可以自己跟踪所有更改的对象,然后遍历所有对象并调用它们的验证方法,但我认为更简单的方法是在保存每个实体之前实现ObjectContext将调用的回调。后者能做到吗?有其他选择吗?好吧,你可以这样做,但这意味着你允许你的客户端直接访问ObjectContext,我个人喜欢将其抽象出来,以使客户端更易于测试 我要做的是使用存储库模式,并在存储库上调用save时进行验证。我已经找到了方法

我想在使用ObjectContext#SaveChanges()存储实体对象之前调用实体对象内部的验证函数。现在,我可以自己跟踪所有更改的对象,然后遍历所有对象并调用它们的验证方法,但我认为更简单的方法是在保存每个实体之前实现ObjectContext将调用的回调。后者能做到吗?有其他选择吗?

好吧,你可以这样做,但这意味着你允许你的客户端直接访问ObjectContext,我个人喜欢将其抽象出来,以使客户端更易于测试


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

我已经找到了方法。基本上,我们可以截获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);
    }
部分无效OnContextCreated()
{
保存更改+=性能验证;
}
无效性能验证(对象发送方,System.EventArgs e)
{
var objStateEntries=ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified);
var violatedRules=新列表();
foreach(ObjectStateEntries中的ObjectStateEntry条目)
{
var实体=条目。实体作为IRuleValidator;
如果(实体!=null)
violatedRules.AddRange(entity.Validate());
}
如果(违反规则.计数>0)
抛出新的ValidationException(违反规则);
}

谢谢-这是个好主意。但我倾向于从简单开始,只在必要时添加更多抽象层。这就是说,客户机测试确实在没有任何模拟的情况下挖掘EF和DB—不完全是单元测试,但到目前为止效果很好。